Ssh
如何在 Archlinux 伺服器上創建 chroot 的 SFTP 訪問?
我已經按照ArchWiki和GeekStuff上的說明設置了一個使用者,該使用者只能通過 SFTP (SSH) 訪問伺服器,但
/bin/false
在其主目錄的 chroot 環境中沒有 Shell ()。沒有什麼特別的,但它根本不起作用,
access denied
當我嘗試登錄時,我不斷收到消息。這是我迄今為止嘗試過的:SFTP 使用者和組
使用者,在這裡:
user
,是組的成員sftp
。主目錄是/srv/sftp/user
. 外殼通過禁用/bin/false
使用者輸入:
0 ✓ root@host ~ $ grep -i user /etc/passwd user:x:1002:1000::/srv/sftp/user:/bin/false
團體入場:
0 ✓ root@host ~ $ grep -i sftp /etc/group sftp:x:1000:user
使用者組:
0 ✓ root@host ~ $ groups user users sftp
主目錄配置
主目錄和上面的所有目錄都歸
root
:0 ✓ root@host ~ $ ls -lsha /srv total 20K 4,0K drwxr-xr-x 6 root root 4,0K 4. Apr 17:00 ./ 4,0K drwxr-xr-x 17 root root 4,0K 4. Apr 15:08 ../ 4,0K dr-xr-xr-x 2 root ftp 4,0K 30. Sep 2015 ftp/ 4,0K drwxr-xr-x 4 root root 4,0K 4. Apr 19:30 http/ 4,0K drwxr-xr-x 5 root root 4,0K 4. Apr 17:00 sftp/ 0 ✓ root@host ~ $ ls -lsha /srv/sftp total 12K 4,0K drwxr-xr-x 5 root root 4,0K 4. Apr 17:00 ./ 4,0K drwxr-xr-x 6 root root 4,0K 4. Apr 17:00 ../ 4,0K drwxr-xr-x 5 root root 4,0K 4. Apr 19:34 user/ 0 ✓ root@host ~ $ ls -lsha /srv/sftp/user total 16K 4,0K drwxr-xr-x 5 root root 4,0K 4. Apr 19:34 ./ 4,0K drwxr-xr-x 5 root root 4,0K 4. Apr 17:00 ../ 4,0K drwxrwxr-x 6 user sftp 4,0K 4. Apr 20:28 files/ 4,0K drwxrwxr-x 2 user sftp 4,0K 4. Apr 19:33 log/
固態混合硬碟配置
SSHD 配置結束:
0 ✓ root@host ~ $ tail -n16 /etc/ssh/sshd_config # override default of no subsystems ### Subsystem sftp /usr/lib/ssh/sftp-server Subsystem sftp internal-sftp ### This section must be placed at the very end of sshd_config # This means that all users in the ‘sftp’ group will be chroot’d # to their home directory, where they only will be able to run # internal SFTP processes. Match Group sftp ChrootDirectory %h ForceCommand internal-sftp AllowTcpForwarding no PermitTunnel no X11Forwarding no PasswordAuthentication yes
固態硬碟狀態:
0 ✓ root@host ~ $ systemctl status sshd ● sshd.service - OpenSSH Daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: disabled) Active: active (running) since Mo 2016-04-04 23:48:58 CEST; 1 day 15h ago Main PID: 9272 (sshd) Tasks: 3 (limit: 512) CGroup: /system.slice/sshd.service ├─ 9272 /usr/bin/sshd -D ├─17597 sshd: user [priv] └─17598 sshd: user [net] [...] Apr 06 15:05:24 host sshd[17597]: Failed password for user from 93.***.***.136 port 45516 ssh2
OpenSSH 版本:
0 ✓ root@host ~ $ pacman -Q openssh openssh 7.2p2-1
更多系統資訊
核心版本:
0 ✓ root@host ~ $ uname -a Linux host 4.4.5-1-ARCH #1 SMP PREEMPT Thu Mar 10 07:38:19 CET 2016 x86_64 GNU/Linux
嘗試連接
為了確保密碼真的正確,我將其更改為
1234
:0 ✓ root@host ~ $ passwd user Enter new UNIX password: 1234 Retype new UNIX password: 1234 passwd: password updated successfully
現在測試
sftp
:1 ✗ me@client ~ $ sftp -P12345 user@host user@host's password: 1234 Permission denied, please try again. user@host's password: 1234 Permission denied, please try again. user@host's password: 1234 Permission denied (publickey,password). Couldn't read packet: Connection reset by peer
這是在日誌中,根本沒有幫助:
0 ✓ root@host ~ $ journalctl -n5 Apr 06 15:34:38 host passwd[25269]: pam_unix(passwd:chauthtok): password changed for user Apr 06 15:35:26 host sshd[25853]: Failed password for user from 93.***.***.136 port 45834 ssh2 Apr 06 15:35:30 host sshd[25853]: Failed password for user from 93.***.***.136 port 45834 ssh2 Apr 06 15:35:33 host sshd[25853]: Failed password for user from 93.***.***.136 port 45834 ssh2 Apr 06 15:35:34 host sshd[25853]: Connection closed by 93.***.***.136 port 45834 [preauth]
我究竟做錯了什麼?我錯過了什麼?如何在沒有 shell 訪問的情況下在 Archlinux 伺服器上創建 chroot 的 SFTP 訪問?
好的,我錯過的一點與外殼有關。我嘗試
/bin/false
按照許多手冊中的說明登錄。但這沒有用。正如@Jakuje 指出的那樣,將其更改為
/bin/sh
用於測試目的允許我通過sftp
. 歡呼!還有一個我也不知道的有趣事實:internal-sftp
已經阻止ssh
登錄。但是,誰還想要的
/bin/false
或/bin/nologin
作為外殼,這是我想通的,最後。檢查外殼是否可用/etc/shells
:0 ✓ root@host ~ $ cat /etc/shells # # /etc/shells # /bin/sh /bin/bash # End of file
難怪它沒有工作!
false
並且nologin
沒有定義!為我手動添加它們:0 ✓ root@host ~ $ cat /etc/shells # # /etc/shells # /bin/sh /bin/bash /bin/false /bin/nologin # End of file
現在,只需更改外殼,使用
chsh
:0 ✓ root@host ~ $ chsh -s /bin/false user Changing shell for user. Shell changed.
現在,
sftp
可以在基於更改的環境中工作,並且無需 shell 訪問。