web-dev-qa-db-ja.com

sftpはchrootされた場合にのみ拒否される許可を与えますか?

私は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

だから拒否の記録があります。それでも理由はわかりません。

何が悪いのでしょうか?

いくつかの潜在的に重要なメモ:

  • 問題のユーザーは、sssd経由でアクセスされるリモートLDAPサーバーに存在します
  • 多くのユーザーがこの同じフォルダーへの読み取りアクセスを必要とするため、アクセス制御はグループごとに行う必要があります。したがって、所有権はルートのままです。

編集:さらなる調査では、これはSELinuxに関連しているようです-echo 0 >/selinux/enforce問題は修正されましたが、賢いやり方ではありますが、ハンマーのような方法でアリを殺しました。可能であれば、「適切な」修正方法を教えてください。

4
ibrewster

このページ で解決策を見つけました。要約すると、上記の構成に従ってsftpを構成した後、SELinuxを有効にしてアクセスを許可するには、次の2つのコマンドを実行する必要があります。

setsebool -P ssh_chroot_rw_homedirs on
restorecon -R /home/$USERNAME

この場合、2番目のコマンドはrestorecon -R /home/pilotsになります。この後、chrootされた場合でも、SELinuxを完全に無効にする必要なく、sftpは期待どおりに動作します。

4
ibrewster

@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

0
a coder