在Ubuntu服务器上创建一个新的SSH用户

刚刚创建了一个新的虚拟 Ubuntu 服务器,现在正在对其进行加固,以供生产使用。我目前有一个 root 帐户。我想做以下几件事:
- 创建一个新用户(我们称之为 jim)。我希望他们拥有一个 /home/ 目录。 - 给予 jim SSH 访问权限。 - 允许 jim 使用 su 切换到 root,但不能执行 sudo 操作。 - 关闭 root 的 SSH 访问权限。 - 将 SSHd 移至非标准端口,以帮助阻止暴力攻击。
我的问题出在前两个步骤上。我已经找到了 useradd 命令,但不知何故,我无法通过 SSH 登录由此创建的用户。我需要修改 SSHd 来允许此操作吗?

嗨!我可以帮你解决服务器问题。我不知道你在SSH方面遇到了什么问题,因为对于我来说,默认配置从未拒绝我的连接。你可以查看man 5 nologin,它写道,如果/etc/nologin存在,你只能用root登录。尝试正常登录,然后告诉我结果。 - antivirtel
用户的shell是什么?是/bin/bash吗?在/etc/password中检查一下。确保它不是/dev/null或/bin/false。 - LFC_fan
是的,LFC_fan,或者也可以使用/etc/nologin。请使用(sudo)cat /etc/passwd | grep jim。 - antivirtel
1@B. Roland 我确实有一个 /etc/nologin 文件,但是它是空的。我已经将其删除并重新启动了 SSH,但是当我尝试登录时,它仍然只是回应 Permission denied, please try again. - Oli
@LFC_fan 这是/bin/bash - Oli
这是passwd行:jimx:1000:1000::/home/jim:/bin/bash - Oli
你是不是打错字了?jimx之间真的应该有一个冒号:。为什么允许su获取root权限,但不允许使用sudo呢? - Lekensteyn
Lekensteyn:是的,这是个打字错误。用户并不真正叫做jim,所以我一直在编辑它...显然有点过头了。 - Oli
你能解释一下你的第三点吗?为什么你允许使用su来切换到root用户,但不允许使用sudo呢? - Lekensteyn
我写了一个脚本来自动化这个过程:https://github.com/TeamHG-Memex/sshadduser - Mark E. Haase
9个回答

SSH对目录和文件权限非常挑剔。请确保:
1. 目录/home/username/.ssh的权限为"700",并且归属于用户(不是root!) 2. 文件/home/username/ssh/authorized_keys的权限为"600",并且归属于用户
将您的公钥复制到authorized_keys文件中。
sudo chown -R username:username /home/username/.ssh
sudo chmod 0700 /home/username/.ssh
sudo chmod 0600 /home/username/.ssh/authorized_keys

无需将用户添加到/etc/ssh/ssh_config。

3我的问题是chown,我以root身份创建了~./ssh,但从未将所有权交给用户。 - Gerve
1我的问题是我试图使用/root/.ssh/authorized_keys而不是/home/bob/.ssh/authorized_keys - Alex W
我可以确认:在我们的VPS托管中,不需要编辑ssh_config。设置该目录和文件就足够了。 - superjos
2对我来说,必须执行chmod 755 /home/username/.ssh,否则它就无法正常工作。 - Jim W says reinstate Monica
1更容易以用户身份登录(或使用“sudo su --login {user}”)并运行“ssh-keygen”->完成“.ssh”文件夹,密钥+证书和权限。只需按照您的说明创建“authorized_keys”即可。 - B. Shea
我可以限制用户访问特定目录吗? - Ravi Soni
哎呀!小心:并且是用户所有(而不是root!) - Mark B

编辑(以root身份)/etc/ssh/sshd_config。在其后添加以下内容:
Port 1234
PermitRootLogin no
AllowUsers jim

端口1234使SSH监听在1234端口上。您可以使用从1到65535的任何未使用的端口。建议选择特权端口(端口1-1024),只能由root用户使用。如果您的SSH守护程序因某种原因停止工作,恶意应用程序无法拦截连接。

PermitRootLogin禁止直接使用root登录。

AllowUsers jim允许用户jim通过SSH登录。如果您不必从任何地方登录,可以通过限制jim的IP地址来增加安全性(将1.2.3.4替换为您的实际IP地址):

AllowUsers jim@1.2.3.4

更改配置文件/etc/ssh/sshd_config不会立即生效,要重新加载配置,请运行:
sudo service ssh reload

10注意:这些指示仍适用于较新版本的Ubuntu(例如13.04)。然而,如果您确实需要root登录(可能是因为您正在设置服务器),您必须将PermitRootLogin设置为yes并将root添加到AllowUsers中。 - JRG-Developer
4这个用户的密码是什么? - Wolfpack'08
我的VPS带有用于SSH登录的22号端口的root密码。将答案附加到sshd_config文件中导致root无法登录。这是因为我还在jim上使用了22号端口,还是有其他原因? - Wolfpack'08
@Wolfpack'08,“PermitRootLogin no”选项的作用与其宣传的完全一致,并适用于任何端口上的所有登录。 - Lekensteyn
1@Lekensteyn 我发现在Ubuntu上添加一个新用户就会为该用户创建一个ssh帐户... useradd -m -G sudo,adm -s /bin/bash mecharokpasswd mecharok - Wolfpack'08
3@Wolfpack'08 使用AllowUsers username1,username2来限制SSH登录只允许这些用户。确保重新加载sshd。如果这不起作用,请提出一个新的问题。 - Lekensteyn
@Lekensteyn 是的,说得好。这样更安全。 - Wolfpack'08
如果在添加用户时未创建SSH区域 -> sudo su --login jim 然后执行 ssh-keygen(为新用户Jim创建".ssh"目录和id_rsa以及id_rsa.pub,并设置适当的权限)OP也可以在此处限制私钥使用密码。或者,相反地,如果您使用'puttygen'创建私钥,可以设置密码。(然后复制它告诉您的位到authorized_keys)。 - B. Shea
实际上,你不需要对/etc/ssh/sshd_config进行修改。 - Ladenkov Vladislav
2@Lekensteyn 你的命令:“AllowUsers username1,username2”格式错误,会将你锁在服务器外面!正确的设置命令是:“AllowUsers username1 username2”。 - kolaworld
对于像我这样的新手来说,看起来 sshd 默认允许所有用户登录,所以只有在你想限制到一部分用户时才需要进行设置。根据 man 手册的说明:“默认情况下,允许所有用户登录”(https://man.openbsd.org/sshd_config#AllowUsers)。 - David Faivre

/var/log/auth.log 中会有关于 SSH(或 PAM)拒绝登录尝试的线索。使用 ssh 客户端时,可以通过使用 -v 选项找到其他线索。几种常见情况,其中一些已经在其他答案中提到:

  • 用户帐户缺少密码或无法使用(请参阅 man passwd,尝试重置密码或检查 /etc/shadow 的内容)。
  • /etc/ssh/sshd_config 配置为拒绝登录(DenyUsersAllowUsersPasswordAuthenticationPubkeyAuthenticationUsePAM 等,请参阅 man sshd_config)。
  • 用户的 shell 在 /etc/shells 中未列出。
  • 与 SSH 操作相关的目录或文件上的各种权限问题:/etc/ssh/home/jim/.ssh/home/jim/.ssh/* 等。
我还建议使用adduser(而不是useradd)来添加新用户;它对各种默认帐户设置更加友好一些。
只要用户不是admin组的一部分,他们将无法sudo到root。如果他们要使用su,您需要设置root密码(passwd root),之后我建议在/etc/ssh/sshd_config中设置PermitRootLogin=no

非常感谢你的出色回答,尤其是"adduser"这个建议帮了我很多! - vishal.biyani

我可能错了,但在连接之前我总是需要安装服务器守护进程(至少在桌面上)。 ssh默认已安装,但那只是客户端。
这个命令安装了服务器。
sudo apt-get install openssh-server 您可以通过编辑来更改端口并停止root登录。
/etc/ssh/sshd_config
不过,这需要您重新启动服务。
sudo service ssh restart

这是一个虚拟服务器(VPS),所以SSH默认安装。这是我与服务器唯一的接口。你也可以通过sudo /etc/init.d/ssh reload重新加载配置,但这仍然是有用的信息。 - Oli

Jim在您设置密码之前将无法使用SSH访问。作为root用户执行以下操作:
grep -i "jim" /etc/shadow | awk -F':' '{ print $2 }'

如果此命令返回一个 "!" 字符,则表示该帐户的登录已被禁用。以 root 身份执行 passwd jim 将提示您输入新密码和确认密码字符串,然后上述 grep 命令应返回代表 jim 密码的哈希字符串。
还请确保 jim 有一个默认设置的登录 shell 和存在的主目录。
请注意 lekensteyn 的帖子,了解如何修改 SSH 服务器设置的信息。

如果这个命令返回一个"!"字符,那么该账户的登录功能将被禁用。请注意,这并不意味着您无法通过SSH进行登录,只是不能使用密码登录(而是需要使用公钥)。 - bfontaine

在我的情况下,我有一个允许访问的组,而用户不是其中的一员。这对我解决了问题。
使用上面的例子,假设用户为jim,并且假设他只属于一个名为jim的组(在以jim身份登录后执行groups命令可以查找自己所属的组)。在我的/etc/ssh/sshd_config文件中,我有一个AllowGroups sshusers的条目,因此需要将jim添加到sshusers组中。以下是如何完成此操作:
usermod -a -G sshusers jim

根据您的配置,适当更改您的组和用户。

1你应该改进你的回答,引用一个更好解释你的例子的来源,或者通过添加相关信息来基于原问题提供例子。例如,用户指定了jim作为一个虚拟用户来帮助提供背景。这篇文章在这里很好地解释了这一点。 - user383919

@Lekensteyn 我无法对问题的答案进行评论,因为我没有足够的声望 - 但是我尝试了添加。
AllowUsers existingUser,newUser

我对我的/etc/ssh/sshd_config文件进行了一些更改,现在无法使用现有用户或新用户进行ssh连接。

我理解你的痛苦 :D 我曾经也遇到过同样的问题。 解决方案: AllowUsers existingUser@* newUser@* - İsmail Atkurt

有时候,默认情况下会禁用PasswordAuthentication
请检查/etc/ssh/sshd_config文件,并确保PasswordAuthentication属性设置为yes

简单说明:

公钥应写在此文件内:

/home/newUsername/.ssh/authorized_keys