使用 SSH 证书认证自动创建用户账户

使用 SSH 证书认证自动创建用户账户

我的 SSH 服务器配置为使用证书认证,因此它会信任任何在连接时出示用户 CA 颁发的证书的人。

由于与审计日志相关的原因,我不希望我的服务器管理员以 root 身份访问服务器。在服务器中创建用户帐户的标准方法是什么,以便管理员可以使用自己的帐户登录?

我正在考虑这样的流程:

  1. 服务器管理员 Alice 想要访问 server1。
  2. 她使用由用户 CA 签名的 SSH 证书连接到发出命令的服务器 1 ssh alice@server1(该证书存储在她本地的 SSH 代理中)。
  3. server1 检查 Alice 的证书签名,并确认它是由用户 CA 使用文件TrustedUserCAKeys中的密钥指定的公钥颁发的sshd_config
  4. server1 将其主机证书发送给 Alice,ssh 客户端使用文件中的主机 CA 的公钥对其进行验证known_hosts
  5. 服务器alice在本地创建用户及其主目录和组绑定。这就是我需要你的魔法的地方
  6. Alice 在 server1 中获取一个用户 shellalice并执行她的管理工作。

答案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 和可能的其他情况,但是展示了这个想法。

相关内容