Linux

無法獲得無密碼(提供 SSH)SFTP 工作

  • January 14, 2014

我已經 chrooted sftp 設置如下。

# Package generated configuration file
# See the sshd_config(5) manpage for details

# What ports, IPs and protocols we listen for
Port 22
# Use these options to restrict which interfaces/protocols sshd will bind to
#ListenAddress ::
#ListenAddress 0.0.0.0
Protocol 2
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
#Privilege Separation is turned on for security
UsePrivilegeSeparation yes

# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600
ServerKeyBits 768

# Logging
SyslogFacility AUTH
LogLevel INFO

# Authentication:
LoginGraceTime 120
PermitRootLogin without-password
StrictModes yes
AllowGroups admins clients

RSAAuthentication yes
PubkeyAuthentication yes
#AuthorizedKeysFile %h/.ssh/authorized_keys

# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes
# For this to work you will also need host keys in /etc/ssh_known_hosts
RhostsRSAAuthentication no
# similar for protocol version 2
HostbasedAuthentication no
# Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication
#IgnoreUserKnownHosts yes

# To enable empty passwords, change to yes (NOT RECOMMENDED)
PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Change to no to disable tunnelled clear text passwords
#PasswordAuthentication yes

# Kerberos options
#KerberosAuthentication no
#KerberosGetAFSToken no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes

X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
#UseLogin no

#MaxStartups 10:30:60
#Banner /etc/issue.net

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

#Subsystem sftp /usr/lib/openssh/sftp-server

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes



Subsystem sftp internal-sftp

Match group clients
   ChrootDirectory /var/chroot-home
   X11Forwarding no
   AllowTcpForwarding no
   ForceCommand internal-sftp

一個虛擬使用者

root:~# tail -n1 /etc/passwd
david:x:1000:1001::/david:/bin/sh

現在在這種情況下,david 可以使用說 filezilla 客戶端進行 sftp,他被 chroot 到 /var/chroot-home/david/。但是,如果我要設置無密碼身份驗證怎麼辦?我嘗試將他的密鑰粘貼到 /var/chroot-home/david/.ssh/authorized_keys 但沒有用,嘗試將 ssh’ing 為 david 到盒子,它在我提供後停止在“debug1:發送 env LC_CTYPE = C”它是密碼,auth.log 中沒有顯示任何內容,可能是因為它找不到 homedir。如果我以 root 身份執行“su - david”,我會看到“無目錄,使用 HOME=/ 登錄”,這是有道理的。符號連結也無濟於事。

我也嘗試過:

Match group clients
       ChrootDirectory /var/chroot-home/%u
       X11Forwarding no
       AllowTcpForwarding no
       ForceCommand internal-sftp

一個虛擬使用者

root:~# tail -n1 /etc/passwd
david:x:1000:1001::/var/chroot-home/david:/bin/sh

這樣,如果我不將 /var/chroot-home/david 更改為 root:root sshd 抱怨所有權或權限模式不正確,如果我這樣做了,david 在使用 sftp 時無法再直接在他的家中上傳/刪除任何內容檔案。

首先,其中的主目錄/etc/passwd應該反映未 chroot 的路徑,否則您通常會遇到問題。在這種情況下,sshd在 chroot 之前檢查授權密鑰,因此它需要使用非 chroot 路徑找到它們。這就是為什麼您的第一次嘗試不起作用的原因。

要注意的第二件事:在您的第一個設置下,當 david 登錄時,他開始登錄/var/chroot-home/david,但他實際上是 chrooted /var/chroot-home,這意味著如果他鍵入cd ..,他可以看到所有其他主目錄(儘管如果權限正確,則看不到它們的內容)。這對您來說可能是也可能不是問題,但要注意這一點是一件好事。


如果以上對你沒問題,你可以使用你的第一個 sshd_config,/var/chroot-home/davidpasswd文件中設置 david 的主目錄,並添加以下符號連結,以便 david 仍然在他的主目錄中啟動:

cd /var/chroot-home
mkdir var
ln -s .. var/chroot-home

該符號連結將確保您可以使用相同的路徑到達主目錄,無論您是否在 chroot 中。


但是,如果您不希望客戶端看到彼此的主目錄的名稱,則需要 chroot 進入主目錄本身,就像在您的第二個解決方案中一樣。但正如您所見,sshd不喜歡那樣(因為各種微妙的原因,給使用者對文件系統根目錄的寫訪問權是危險的)。可悲的是,你在這里大多不走運。對此的一個(kludgy)解決方案是在每個主目錄中創建一個files/子目錄,並賦予客戶端對它的寫訪問權限。

另一種選擇可能是chroot 到/var/chroot-home,並以不同的方式命名主目錄,例如使用使用者ID 號而不是名稱。

引用自:https://serverfault.com/questions/237552