私はcentosボックスに以下のようにsshd_confを設定しました:
Match group pilots
ChrootDirectory /home/pilots
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
次のようなディレクトリ/ home/pilots:
# ls -al /home/pilots
total 12
drwxr-x---. 3 root pilots 4096 Mar 10 14:20 .
drwxr-xr-x. 7 root root 4096 Mar 10 14:10 ..
drwxrwxr-x. 2 root pilots 4096 Mar 10 15:21 data
-rwxrwxrwx. 1 root root 0 Mar 10 14:20 topLevel
#
ChrootDirectoryディレクティブを有効にせずにパイロットグループのユーザーとしてsftpでログインした場合、/ home/pilotsフォルダー(またはそのサブディレクトリー)にcdして、lsを実行するか、問題なく取得できます。ただし、ChrootDirectoryディレクティブを有効にすると、sftpを実行でき、データにcdできますが、lsを実行したり、どちらのディレクトリにもアクセスできません。たとえば、lsを試行すると、リモートのreaddir( "/"):権限が拒否されましたというエラーが発生し、topLevelを取得しようとすると、ファイル "/ topLevel"が見つかりません。多分自分が期待していたディレクトリにいないのではないかと思っていましたが、データをcdする機能は、chrootが意図したとおりに機能したことを示しているように見えます。
メッセージログを見ると、lsが拒否されたときに次のことがわかります。
type=1400 audit(1394494944.504:50): avc: denied { read } for pid=22758 comm="sshd" name="pilots" dev=dm-0 ino=400504 scontext=unconfined_u:system_r:chroot_user_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:home_root_t:s0 tclass=dir
だから拒否の記録があります。それでも理由はわかりません。
何が悪いのでしょうか?
いくつかの潜在的に重要なメモ:
編集:さらなる調査では、これはSELinuxに関連しているようです-echo 0 >/selinux/enforce
問題は修正されましたが、賢いやり方ではありますが、ハンマーのような方法でアリを殺しました。可能であれば、「適切な」修正方法を教えてください。
このページ で解決策を見つけました。要約すると、上記の構成に従ってsftpを構成した後、SELinuxを有効にしてアクセスを許可するには、次の2つのコマンドを実行する必要があります。
setsebool -P ssh_chroot_rw_homedirs on
restorecon -R /home/$USERNAME
この場合、2番目のコマンドはrestorecon -R /home/pilots
になります。この後、chrootされた場合でも、SELinuxを完全に無効にする必要なく、sftpは期待どおりに動作します。
@ibrewsterの answer (彼がリンクしている external resource を含む)の最後に、この外部ページからの完全な手順と、この作業を行うための追加情報を示しますパスワードなしのログインとSELinuxの強制。
外部リンクされたページが将来なくなった場合に備えて、ここに再投稿します。
これらの手順は、RHEL7とCentOS7(およびおそらく他のリリース)に適用されます。
まず、chrootするユーザーアカウントを追加して構成します。
外部リソース がsftp-server
に別のパスを使用したことに注意してください。システムに正しいパスがあることを確認するか、痛みに備えてください。 ;-)以下のパスは、RHEL7およびCentOS7の最小インストールで機能します。
# From command line:
groupadd sftponly
useradd -d /home/$USERNAME -s /usr/libexec/openssh/sftp-server -M -N -g sftponly $USERNAME
mkdir -p /home/$USERNAME/uploads /home/$USERNAME/downloads /home/$USERNAME/.ssh
chown $USERNAME:sftponly /home/$USERNAME/uploads /home/$USERNAME/downloads /home/$USERNAME/.ssh
chown root /home/$USERNAME
chmod 755 /home/$USERNAME
chmod 700 /home/$USERNAME/.ssh
passwd $USERNAME
echo '/usr/libexec/openssh/sftp-server' >> /etc/shells
上記でパスワードを設定しましたが、設定が機能することがわかったら、パスワードなしのログインを使用します。以降...
SELinux
を有効にして実行している(必要な場合)と想定して、次のコマンドを発行して満足させます。
setsebool -P ssh_chroot_rw_homedirs on
restorecon -R /home/$USERNAME
次に、sshd構成を次のように編集します。
[root@remote]# vi /etc/ssh/sshd_config
#
# CHANGE lines:
#
# override default of no subsystems
#Subsystem sftp /usr/libexec/openssh/sftp-server # commented out
Subsystem sftp internal-sftp # added
#
# ADD the following at the bottom:
#
Match group sftponly
ChrootDirectory %h
AllowTcpForwarding no
ForceCommand internal-sftp
最後に、sshdを再起動します
[root@remote]# systemctl restart sshd.service
最初に同じアカウントをローカルで作成します。
[root@client]# useradd -m $USERNAME
[root@client]# passwd $USERNAME
[root@client]# su $USERNAME
では、RSAキーペアをセットアップしましょう。
[$USERNAME@client]# ssh-keygen
上記のchroot設定でssh-copy-idを動作させることができなかったため、クライアントのid_rsa.pubテキストを使用してauthorized_keys
ファイルを手動で作成しました。
[$USERNAME@client]# cat .ssh/id_rsa.pub
---some key here---
次にREMOTEシステムに戻り、
[root@remote]# vi /home/$USERNAME/.ssh/authorized_keys
---past key from right above, then wq---
このファイルに権限を設定することを忘れないでください:
[root@remote]# chown $USERNAME:sftpusers /home/$USERNAME/.ssh/authorized_keys
これですべてが整いました。クライアントから:
[$USERNAME@client]# sftp $USERNAME@remote
これでうまくいくはずです。パスワードの入力を求められた場合(リモートでPasswordAuthenticationをまだ無効にしていないため)、リモートシステムの構成に問題があります。詳細については、/ var/log/secureをスキャンしてください。
パスワードの入力を求められずにサインオンすると、ほぼ完了です。
[root@remote]# vi /etc/ssh/sshd_config
# disable PasswordAuthentication
PasswordAuthentication no
# or optionally, just comment that line out
# PasswordAuthentication no
-- save and exit with :wq --
リモートシステムでsshdを再起動します。
[root@remote]# systemctl restart sshd.service
[$USERNAME@client]# sftp $USERNAME@remote
# in like Flynn? yay!
chroot sftpおよびpasswordless login(with SELinux
set toenforcing)