DockerでCentOSのsshdを試す

Dockerが面白そうなので少しさわっています。dockerのページにあるsshdの例(Dockerizing an SSH service)を基にしてCentOS用Dockerfileを作ってみました。

# sshd
#
# VERSION               0.0.1

FROM     centos
MAINTAINER IMAI "imai@example.com"

# make sure the package repository is up to date
RUN yum update -y

RUN yum install -y openssh-server
RUN echo 'root:screencast' |chpasswd

RUN sed -i '/pam_loginuid\.so/s/required/optional/' /etc/pam.d/sshd
RUN /sbin/service sshd start
RUN /sbin/service sshd stop

EXPOSE 22
CMD    ["/usr/sbin/sshd", "-D"]

最終的にはログインできるようになったのですが、結構手こずったのでここまでの経緯を書いておきます。

CentOS6.5で動かしていて、Docker本体はEPELから持ってきたものです。

#yum list -q docker-io
Installed Packages
docker-io.x86_64                       0.11.1-4.el6                        @epel
# docker version
Client version: 0.11.1
Client API version: 1.11
Go version (client): go1.2.1
Git commit (client): fb99f99/0.11.1
Server version: 0.11.1
Server API version: 1.11
Git commit (server): fb99f99/0.11.1
Go version (server): go1.2.1
Last stable version: 1.0.0, please update docker
#

参考にした、Dockerizing an SSH serviceも頻繁に修正されているようで、Gitのログを見るとつい最近ubuntu用からdebian用に書き換えられたようです。私が参照したのは[commit 04620e0]で下記のDockerfileです。

# sshd
#
# VERSION               0.0.1

FROM     debian
MAINTAINER Thatcher R. Peskens "thatcher@dotcloud.com"

# make sure the package repository is up to date
RUN apt-get update

RUN apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:screencast' |chpasswd

EXPOSE 22
CMD    ["/usr/sbin/sshd", "-D"]

これを基にCentOS用に下記の変更をしました。

  • 1回目
    • FROMをdebianからcentosに変更
    • apt-getをyumに変更
    • mkdir /var/run/sshdを削除(sshd_configによると、sshdのpidファイルは/var/run直下に直接作成されるので)

     
    結果
    以下のエラーで接続できない。

    $ ssh root@192.168.1.20 -p 49153
    Connection closed by 192.168.1.20

    docker logsで何か出ていないかと見てみたら出てた。

    # docker logs test_sshd
    Could not load host key: /etc/ssh/ssh_host_rsa_key
    Could not load host key: /etc/ssh/ssh_host_dsa_key
  • 2回目
    /etc/init.d/sshd start処理内で、まだhost keyがなければ自動で作成されるので、一旦service sshd start, stopをやっておくようにした。
     
    結果
    パスワード入力までできるが、Connection to 192.168.1.20 closed.になる。
    -vオプションと付けて試してみたところ、ログインはできているがすぐにconnection closedされるようだ。

    $ ssh -v root@192.168.1.20 -p 49154
    ...
    debug1: Next authentication method: password
    root@192.168.1.20's password: 
    debug1: Authentication succeeded (password).
    debug1: channel 0: new [client-session]
    debug1: Requesting no-more-sessions@openssh.com
    debug1: Entering interactive session.
    debug1: Sending environment.
    debug1: Sending env LANG = ja_JP.UTF-8
    Last login: Tue Jun 10 06:16:19 2014 from 192.168.1.16
    debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
    debug1: client_input_channel_req: channel 0 rtype eow@openssh.com reply 0
    debug1: channel 0: free: client-session, nchannels 1
    Connection to 192.168.1.20 closed.
    Transferred: sent 1912, received 2128 bytes, in 0.0 seconds
    Bytes per second: sent 206321.5, received 229629.8
    debug1: Exit status 254

    ネットで、sshdでPAMを使わないようにすればOKという情報を良く見かけたので試したが、だめだった。

  • 3回目

    Ubuntuの例だが、PAMのSSHDの設定で、pam_loginuidのcontrolをrequiredからoptionalにかえると良いという情報があったので試す。
     
    結果
    無事sshパスワード認証でログインできるようになった。

なぜ、pam_loginuidをoptionalにしなければならないのだろうと調べたところ、これもUbuntuだけど情報が見つかった。Dockerでは、loginuid audit attributeの使用に必要な機能が落とされているかららしい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA