是否可以授予用户sftp访问权限而无需外壳访问?如果是,如何实施?


29

我有一些用户需要将文件上传到其设置的homedirs中。我认为sftp就足够了,但是我不希望它们通过shell登录。那有可能吗?我的平台是centos 7,用户的homedirs存储说/ personal / $ user

我使用这些设置创建了用户

useradd -m -d /personal/user1 -s /sbin/nologin

分配用户一个密码,然后当我使用sftp登录到计算机时,它说无法连接。



Answers:


11

编辑您/etc/ssh/sshd_config要包含的内容:

Match User [SFTP user]
ForceCommand internal-sftp

重新启动sshd。如果您有多个用户,则将它们全部放在匹配用户行上,并用逗号分隔,如下所示:

Match User User1,User2,User3

配置sftp为不允许外壳程序访问的关键是通过该ForceCommand 选项限制用户。


确定,我确实按照所有步骤操作,但没有登录
Sollosa

2
@Sollosa Match User [SFTP user] ForceCommand internal-sftp仅尝试使用,不要写任何东西。
Martin Prikryl

@MartinPrikryl马丁工作,谢谢,我刚刚删除了chrootdirectory参数和中提琴
Sollosa

1
最重要的是,您可以chroot使用户无法导航并跳出定义的“监狱”
ivanivan

37

我喜欢以下用于管理SSH访问的设置,该设置在工作中用于管理小型服务器群中的一组用户。安全和易管理性是我的首要任务。

它的主要功能是通过Unix组成员身份轻松管理SSH权限,具有严格定义的权限以及默认情况下是安全的。

配置

安装软件(可选,但有用):

yum install members   # or apt install members

添加组:

addgroup --system allowssh
addgroup --system sftponly

在中/etc/ssh/sshd_config,请确保以下设置为No

PermitRootLogin no
PubkeyAuthentication no
PasswordAuthentication no

在的末尾/etc/ssh/sshd_config添加以下两个节:

Match Group allowssh
    PubkeyAuthentication yes

Match Group sftponly
    ChrootDirectory %h
    X11Forwarding no
    AllowTcpForwarding no
    ForceCommand internal-sftp

(不要忘记在编辑文件后重新启动SSH)

说明

那么,这一切是做什么的呢?

  • 作为一种额外的安全措施,它始终禁用root登录。
  • 它总是禁用基于密码的登录(密码弱对运行sshd的服务器来说是很大的风险)。
  • 它仅允许(pubkey)登录该allowssh组中的用户。
  • sftponly组中的用户无法通过SSH获得外壳程序,只能通过SFTP获得外壳程序。

然后,只需通过管理组成员身份即可完成对谁具有访问权限的管理(这些更改将立即生效,无需重新启动SSH):

# adduser marcelm allowssh
# members allowssh
marcelm
# deluser marcelm allowssh
# members allowssh
#

请注意,您的sftp用户需要既是sftponly(以确保他们不会获得外壳程序)的成员,又是allowssh(首先允许登录)的成员。

更多信息

  1. 请注意,此配置不允许密码登录。所有帐户都需要使用公共密钥身份验证。这可能是使用SSH可以获得的最大的安全性胜利,因此即使您必须立即开始,我也认为值得这样做。

    如果您确实不希望这样做,也可以添加PasswordAuthentication yesMatch Group allowssh节中。这将允许用户对pubkey和password进行身份验证allowssh

  2. 此配置将任何sftponly用户限制在其主目录中。如果您不希望这样做,请删除该ChrootDirectory %h指令。

    如果您确实希望chrooting能够正常工作,那么用户的主目录(及其上方的任何目录)root:root应由组/其他所有者拥有,并且不可写,这一点很重要。主目录的子目录可以是用户拥有的和/或可写的。

    是的,用户的主目录必须是root拥有的,并且对用户不可写。可悲的是,有此限制的充分理由。根据您的情况,ChrootDirectory /home可能是一个不错的选择。

  3. 设置的外壳sftponly用户/sbin/nologin是既无必要,也有害于这种解决方案,因为SSH的ForceCommand internal-sftp覆盖用户的shell。

    使用/sbin/nologin可能有助于阻止他们通过其他方式(物理控制台,samba等)登录。

  4. 此设置不允许root通过SSH 直接登录。这形成了额外的安全层。如果你真的需要直接root登录,修改PermitRootLogin指令。考虑将其设置为forced-commands-onlyprohibit-password和(作为最后的选择)yes

  5. 要获得加分,请看看限制谁可以su生根;添加称为系统组wheel,和添加/启用auth required pam_wheel.so/etc/pam.d/su


2
这应该是公认的答案。它提供了解决方案,并细分了每个步骤背后的原因。
kemotep

1
这是一个非常不错的答案,并带有大量其他安全建议,但我确实会对那些系统依赖密码登录名,root登录名等用户的用户感到担忧。这样做虽然不好,但可能会将与常规安全性改进相关的更改移至他们的用户自己的部分,以便以最小的变化获得问题的答案?
Josh Rumbut

1
@JoshRum但是我不想重写您的(非常正确的)评论的答案,部分是因为它实际上只是在显示My Way™,部分是希望它可以是一种默认的安全默认SSH设置更多人发现有用的例子。作为一种妥协,我试图更清楚地表明根登录名和密码身份验证将不起作用,并且我提供了有关如何重新启用它们的说明:)
marcelm

1
好的答案,imo其他答案的最大缺点是没有考虑安全方面,主要是chroot。+1
Rui F Ribeiro

1
Chroot将不适用于通用%h。令人惊讶的是,您必须chown root:rootchmod og-w
kubanczyk

1

只需将其默认shell更改为/ sbin / nologin。假设大多数Linux版本:

# usermod -s /sbin/nologin username

我已经尝试过了,但是用户无法通过sftp登录,我不知道为什么。我正在使用centos btw。
Sollosa

@Sollosa可能是sftp chroot中的权限问题,或者sshd_config有问题。您应该更新您的问题,以包括chroot目录和sshd_config的权限,并删除所有敏感信息。
凯夫卡

我相信(尽管我现在不能测试),只有在Subsystem sftp internal-sftp)(或也许ForceCommand internal-sftp)时,它才允许SFTP 。如果通用Subsystem sftp /path/to/sftp-servernologin甚至会阻止SFTP。
Martin Prikryl

@MartinPrikryl我误解了他们原来未编辑的问题,询问如何在其他功能正常的sftp服务器上为用户禁用外壳程序访问。当时我已经醒了大约十分钟,所以我没有头脑清醒的感觉。尽管我不知道sftp-server要求用户具有有效的外壳才能工作-但这似乎很危险。我只是出于习惯而只使用internal-sftp,因为这就是我一直这样做的方式。
Kefka

请参阅我对OpenSSH的回答:internal-sftp和sftp-server之间的区别(尤其是结尾部分)
Martin Prikryl

0

您可以使用tftp。通过ssh进行的任何操作都需要一定的身份验证(密钥|传递)。

尽管可以保护tftp,但值得重新考虑是否提供不经身份验证即可访问任何内容的决定。

http://manpages.ubuntu.com/manpages/bionic/man1/tftp.1.html


2
我认为OP希望用户(大概具有用户名和密码)不能使用常规的SSH客户端连接到服务器并执行任意命令,但是那些相同的用户能够通过SFTP上传文件。
John_ReinstateMonica
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.