QA@IT

【SELinux】xinetd経由のOpenSSHでChrootDirectoryを設定すると接続できなくなる

4998 PV

最終的にやりたいことは、SELinuxをenforcingモードにしたまま、ホームディレクトリをルートとしてSFTP接続することです。
よろしくお願いいたします。

環境

  • CentOS 6.5
  • xinetd 2.3.14
  • OpenSSH_5.3p1
  • iptables 1.4.7
  • SELinux – targetedポリシーで動作
  • FileZilla 3.8.0

発生している問題

後述の手順でOpenSSHとSELinuxの設定を行いましたが、この状態でFileZillaから接続すると、以下のようなエラーが出て失敗します。

状態: 192.0.2.1:22 に接続中...
レスポンス:    fzSftp started
コマンド:   keyfile "Q:\example.ppk"
コマンド:   open "username@192.0.2.1" 22
コマンド:   新規ホスト鍵を信用: 一度だけ
エラー:  Network error: Software caused connection abort
エラー:  サーバに接続できませんでした

サーバー側でsudo grep avc: /var/log/messagesを実行しても、新たなポリシー違反は記録されていませんでした。

設定手順

/etc/ssh/sshd_configへ追記
Subsystem sftp internal-sftp
Match User username
    ChrootDirectory %h
    ForceCommand internal-sftp
SELinuxの変数値を変更
sudo setsebool -P ssh_chroot_full_access on
sudo setsebool -P ssh_chroot_manage_apache_content on
ポリシーファイル作成・コンパイル・インストール
module sshd 1.0;

require {
        type chroot_user_t;
        type inetd_t;
        type sshd_t;
        type user_home_dir_t;
        class tcp_socket { getopt getattr setopt };
        class file read;
}

#============= chroot_user_t ==============
allow chroot_user_t inetd_t:tcp_socket { getopt getattr setopt };

#============= sshd_t ==============
allow sshd_t user_home_dir_t:file read;

試してみたこと

sudo setenforce 0でSELinuxをpermissiveモードにすると接続できるようになりました。

また、OpenSSHの設定でChrootDirectory %hをコメントアウトした場合、SELinuxがenforcingモードのままでも接続できました。

補足 (2014-04-17)

flied_onion様、コメント有り難うございます。

ChrootDirectoryで指定しているディレクトリは、以下のように所有者をrootにしています。

$ ls /home -l --context
drwxr-x---. root username unconfined_u:object_r:user_home_dir_t:s0 username

SELinuxをpermissiveモードにすると接続できるようになるのですが、いずれの場合も/var/log/messageにポリシー違反は記録されておらず、原因がわかりません。
Auditは起動しておらず、sudo ausearch --message AVCを実行すると<no matches>が返ります。

SELinuxがenforcingモード

/var/log/message

Apr 16 23:05:18 example xinetd[333]: START: ssh pid=11111 from=::ffff:203.0.113.1
Apr 16 23:05:19 example xinetd[333]: EXIT: ssh status=255 pid=11111 duration=1(sec)
Apr 16 23:05:24 example xinetd[333]: START: ssh pid=22222 from=::ffff:203.0.113.1
Apr 16 23:05:25 example xinetd[333]: EXIT: ssh status=255 pid=22222 duration=1(sec)

/var/log/secure

Apr 16 23:05:19 example sshd[11111]: Accepted publickey for username from 203.0.113.1 port 56789 ssh2
Apr 16 23:05:19 example sshd[11111]: pam_unix(sshd:session): session opened for user username by (uid=0)
Apr 16 23:05:19 example sshd[11111]: pam_unix(sshd:session): session closed for user username
Apr 16 23:05:24 example sshd[22222]: Accepted publickey for username from 203.0.113.1 port 54321 ssh2
Apr 16 23:05:25 example sshd[22222]: pam_unix(sshd:session): session opened for user username by (uid=0)
Apr 16 23:05:25 example sshd[22222]: pam_unix(sshd:session): session closed for user username
SELinuxがpermissiveモード

/var/log/message

Apr 16 23:34:22 example xinetd[333]: START: ssh pid=11111 from=::ffff:203.0.113.1

/var/log/secure

Apr 16 23:34:22 example sshd[11111]: Accepted publickey for ftpuser from 203.0.113.1 port 56789 ssh2
Apr 16 23:34:23 example sshd[11111]: pam_unix(sshd:session): session opened for user ftpuser by (uid=0)
Apr 16 23:34:23 example sshd[11111]: subsystem request for sftp

FileZillaのメッセージログ

状態: 192.0.2.1:22 に接続中...
レスポンス:    fzSftp started
コマンド:   keyfile "Q:\example.ppk"
コマンド:   open "username@192.0.2.1" 22
コマンド:   新規ホスト鍵を信用: 一度だけ
状態: Connected to 192.0.2.1
状態: ディレクトリ一覧を取得中...
コマンド:   pwd
レスポンス:    Current directory is: "/"
コマンド:   ls
状態: Listing directory /
状態: サーバのタイムゾーン オフセットを計算しています...
コマンド:   mtime "test"
レスポンス:    1386241655
状態: タイムゾーン オフセット: 0 秒, ローカル: 32400 秒, 差分 32400 秒.
状態: ディレクトリ一覧の表示成功

補足 (2014-04-19)

/etc/xinetd.d/sshdの内容

service ssh
{
        disable = no
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/sshd
        server_args     = -i
        log_on_success += HOST PID
        log_on_failure += HOST USERID
        nice            = 10
}

【2015-07-09 追記】

CentOS 7 の systemd を xinetd 代わりに利用したところ、接続に成功しました。

sudo systemctl enable sshd.socket
sudo systemctl start sshd.socket
sudo systemctl stop sshd
sudo systemctl disable sshd
  • ちがってたらすいませんが、この設定の場合ChrootDirectoryに指定されるディレクトリの所有者はrootで無ければ無かったような気がします。/var/log/secureログにbad ownership が出ていませんか? -

回答

CentOS 6.5 x64(インストールしたて)で同様の設定を試してみましたが、接続できました。
参考になるかはわかりませんが、以下のような設定になっています(といってもほとんどは同じです)。
なお、apacheはインストールしてませんのでその辺りの設定なのかもしれません。

sftpuserというユーザーを対象に設定しています。


Windows 8.1 側

秘密鍵
ppkファイルは、CentOS上で作成した秘密鍵を puttygenにロードし、ppkとして保存。
パスフレーズなし。
pageantは終了させてある。

FileZilla
FileZillaのsftp設定で、ppk設定済み。

FileZilla サイトマネージャの設定

  • プロトコル : SFTP
  • ログオンの種類:通常
  • ユーザー名:sftpuser
  • パスワード:<空>

FileZilla 成功ログ

状態: 172.16.79.192 に接続中...
レスポンス:    fzSftp started
コマンド:   keyfile "C:\ssh_key_centos_sftp\c65sftp.ppk"
コマンド:   open "sftpuser@172.16.79.192" 22
状態: Connected to 172.16.79.192
状態: ディレクトリ一覧を取得中...
コマンド:   pwd
レスポンス:    Current directory is: "/"

CentOS

SELinux

[root@localhost ~]# getenforce
Enforcing

[root@localhost ~]# getsebool ssh_chroot_full_access
ssh_chroot_full_access --> on
[root@localhost ~]# getsebool ssh_chroot_manage_apache_content
ssh_chroot_manage_apache_content --> on

ポリシー

[root@localhost ~]# semodule -l | grep sshd
sshd    1.0 

[root@localhost tework]# cat local.te
module sshd 1.0;

require {
    type chroot_user_t;
    type inetd_t;
    type sshd_t;
    type user_home_dir_t;
    class tcp_socket { getopt getattr setopt };
    class file read;
}

#============= chroot_user_t ==============
allow chroot_user_t inetd_t:tcp_socket { getopt getattr setopt };

#============= sshd_t =============
allow sshd_t user_home_dir_t:file read;

sshd
/etc/ssh/sshd_config 変更部分のみ

# override default of no subsystems
##Subsystem     sftp    /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match User sftpuser
    ForceCommand internal-sftp
    ChrootDirectory /home/%u

公開鍵 パーミッション
home.ssh750authorized_keys440

[root@localhost ~]# ls -lad /home/sftpuser/
drwxr-x---. 4 root sftpuser 4096  4月 17 06:46 2014 /home/sftpuser/
[root@localhost ~]# ls -lad /home/sftpuser/.ssh
drwxr-x---. 2 root sftpuser 4096  4月 17 06:34 2014 /home/sftpuser/.ssh
[root@localhost ~]# ls -la /home/sftpuser/.ssh/authorized_keys 
-r--r-----. 1 root sftpuser 408  4月 17 06:33 2014 /home/sftpuser/.ssh/authorized_keys

その他

Apacheなし

[root@localhost ~]# service httpd status
httpd: 認識されていないサービスです。
編集 履歴 (1)
  • 確認していただきどうもありがとうございます。xinetdを経由せずに直接sshdを起動したところ、同じ設定でenforcingモードのまま接続することができました。基本的な部分で問題の絞り込みができておらず、申し訳ございません。 -
  • CentOS 7 の systemd において、xinetd の代わりに socket タイプの Unit を使用したところ同様の問題は発生しませんでしたので、解決済みとさせていただきます。ありがとうございました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。