我的 SSH 服务器配置为使用证书认证,因此它会信任任何在连接时出示用户 CA 颁发的证书的人。
由于与审计日志相关的原因,我不希望我的服务器管理员以 root 身份访问服务器。在服务器中创建用户帐户的标准方法是什么,以便管理员可以使用自己的帐户登录?
我正在考虑这样的流程:
- 服务器管理员 Alice 想要访问 server1。
- 她使用由用户 CA 签名的 SSH 证书连接到发出命令的服务器 1
ssh alice@server1
(该证书存储在她本地的 SSH 代理中)。 - server1 检查 Alice 的证书签名,并确认它是由用户 CA 使用文件
TrustedUserCAKeys
中的密钥指定的公钥颁发的sshd_config
。 - server1 将其主机证书发送给 Alice,ssh 客户端使用文件中的主机 CA 的公钥对其进行验证
known_hosts
。 - 服务器
alice
在本地创建用户及其主目录和组绑定。这就是我需要你的魔法的地方。 - Alice 在 server1 中获取一个用户 shell
alice
并执行她的管理工作。
答案1
遵循以下想法此回复, 您可以使用库允许 /etc/passwd 中不存在的经过身份验证的用户。
用于创建主目录也很有用pam_mkhomedir
(对于 ssh 应该添加到/etc/pam.d/sshd
):
session required pam_mkhomedir.so skel=/etc/skel/ umask=0022
libnss_shim 可能是这样的:
{
"databases": {
"passwd": {
"functions": {
"get_entry_by_uid": {
"command": "/usr/local/bin/passwd_get_all_entries.sh -u <$uid>"
},
"get_entry_by_name": {
"command": "/usr/local/bin/passwd_get_all_entries.sh -n <$name>"
}
}
},
"shadow": {
"functions": {
"get_entry_by_name": {
"command": "/bin/bash -c \"echo $name:*:19156:0:99999:7:::\""
}
}
}
}
}
脚本如下passwd_get_all_entries.sh
:
#!/bin/bash
if [ $# -eq 0 ]; then
exit 0
fi
while getopts "u:n:" opt; do
case $opt in
u)
uid=$OPTARG
name=$(find /home -maxdepth 1 -type d -uid $uid | head -1 | cut -d "/" -f 3)
echo "$name:x:$uid:1::/home/$name:/bin/bash"
;;
n)
name=$OPTARG
uid=$(stat -c %u /home/$name 2>/dev/null)
if [[ -z $uid ]]; then
uid=$(stat -c %u /home/* | sort | tail -1 | awk '{print $1+1;}')
fi
sudo_gid=27
echo "$name:x:$uid:$sudo_gid::/home/$name:/bin/bash"
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
esac
done
这将允许任何通过签名的 ssh 证书进行身份验证的用户登录,并且它将拥有主目录和唯一的 uid。
bash 脚本不处理可能重复的 UID 和可能的其他情况,但是展示了这个想法。