AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 653792
Accepted
c4urself
c4urself
Asked: 2014-12-20 12:13:09 +0800 CST2014-12-20 12:13:09 +0800 CST 2014-12-20 12:13:09 +0800 CST

使用 LDAP 的 SSH 密钥认证

  • 772

简而言之:

想要一种通过 LDAP 进行 SSH 密钥身份验证的方法。

问题:

我们将 LDAP (slapd) 用于目录服务,并且我们最近开始使用我们自己的 AMI 来构建实例。AMI 位很重要的原因是,理想情况下,我们希望能够在实例运行后立即通过密钥身份验证使用 SSH 登录,而不必等待我们有点慢的配置管理工具启动脚本来添加实例的正确键。

理想的情况是,当将用户添加到 LDAP 时,我们也添加了他们的密钥,他们将能够立即登录。

密钥身份验证是必须的,因为基于密码的登录既不安全又麻烦。

我已经阅读了这个问题,它表明 OpenSSH 有一个名为 OpenSSH-lpk 的补丁可以执行此操作,但 OpenSSH 服务器 >= 6.2 不再需要此补丁

添加了 sshd_config(5) 选项 AuthorizedKeysCommand 以支持从文件系统中获取授权密钥(或代替)从命令中获取。该命令在 AuthorizedKeysCommandUser sshd_config(5) 选项指定的帐户下运行

如何配置 OpenSSH 和 LDAP 来实现这一点?

ssh
  • 4 4 个回答
  • 116675 Views

4 个回答

  • Voted
  1. Best Answer
    c4urself
    2014-12-20T12:13:09+08:002014-12-20T12:13:09+08:00

    更新 LDAP 以包含 OpenSSH-LPK 架构

    我们首先需要使用模式更新 LDAP 以添加sshPublicKey用户属性:

    dn: cn=openssh-lpk,cn=schema,cn=config
    objectClass: olcSchemaConfig
    cn: openssh-lpk
    olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey'
        DESC 'MANDATORY: OpenSSH Public key'
        EQUALITY octetStringMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
    olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY
        DESC 'MANDATORY: OpenSSH LPK objectclass'
        MAY ( sshPublicKey $ uid )
        )
    

    创建一个脚本,在 LDAP 中查询用户的公钥:

    该脚本应输出该用户的公钥,例如:

    ldapsearch '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey' | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp'

    更新sshd_config以指向上一步中的脚本

    • AuthorizedKeysCommand /path/to/script
    • AuthorizedKeysCommandUser nobody

    奖励:更新sshd_config以允许来自内部 RFC1918 网络的密码身份验证,如本问题所示:

    只允许从内部网络对 SSH 服务器进行密码验证

    有用的链接:

    • https://github.com/AndriiGrytsenko/openssh-ldap-publickey
    • 使用 pam_ldap 进行私钥认证

    编辑:nobody按照建议的 TRS-80添加用户

    • 89
  2. mbrgm
    2016-11-16T02:39:55+08:002016-11-16T02:39:55+08:00

    这不是一个完整的答案,只是对c4urself 的答案的补充。我会将此添加为评论,但我没有足够的声誉发表评论,所以请不要投反对票!

    这是我使用的脚本AuthorizedKeysCommand(基于 c4urself 的版本)。无论该值是否以 base64 编码返回,它都有效。如果您想在 LDAP 中存储多个授权密钥,这可能特别有用——只需用换行符分隔密钥,类似于 authorized_keys 文件。

    #!/bin/bash
    set -eou pipefail
    IFS=$'\n\t'
    
    result=$(ldapsearch '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey')
    attrLine=$(echo "$result" | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;/sshPublicKey:/p')
    
    if [[ "$attrLine" == sshPublicKey::* ]]; then
      echo "$attrLine" | sed 's/sshPublicKey:: //' | base64 -d
    elif [[ "$attrLine" == sshPublicKey:* ]]; then
      echo "$attrLine" | sed 's/sshPublicKey: //'
    else
      exit 1
    fi
    
    • 8
  3. Scott
    2016-03-09T05:18:26+08:002016-03-09T05:18:26+08:00

    对于在运行 ldapsearch 时遇到错误的任何人:

    sed: 1: "/^ /{H;d};": extra characters at the end of d command
    

    和我一样(在 FreeBSD 上),解决方法是将第一个 sed 命令更改为:

    /^ /{H;d;};
    

    (在“d”之后添加分号)。

    • 5
  4. FreeSoftwareServers
    2016-09-19T11:44:11+08:002016-09-19T11:44:11+08:00

    只是想分享我的“方法”,我的客户端是 Debian/Ubuntu 特定的,但我的服务器端与上面基本相同,但多了一点“HowTo:”

    服务器 :

    启用公钥属性:

    信用 :

    https://blog.shichao.io/2015/04/17/setup_openldap_server_with_openssh_lpk_on_ubuntu.html

    cat << EOL >~/openssh-lpk.ldif
    dn: cn=openssh-lpk,cn=schema,cn=config
    objectClass: olcSchemaConfig
    cn: openssh-lpk
    olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey'
      DESC 'MANDATORY: OpenSSH Public key'
      EQUALITY octetStringMatch
      SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
    olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY
      DESC 'MANDATORY: OpenSSH LPK objectclass'
      MAY ( sshPublicKey $ uid )
      )
    EOL
    

    现在使用它来添加 ldif :

    ldapadd -Y EXTERNAL -H ldapi:/// -f ~/openssh-lpk.ldif
    

    在 phpLDAPadmin 中添加具有 SSH 公钥的用户

    首先,使用“通用:用户帐户”模板创建一个用户。然后,进入“objectClass”属性部分,点击“add value”,选择“ldapPublicKey”属性。提交后,回到用户编辑页面,点击顶部的“添加新属性”,选择“sshPublicKey”,将公钥粘贴到文本区域,最后点击“更新对象”。

    sshPublicKey 属性未显示 - OpenLDAP PHPLDAP SSH 密钥验证

    Ubuntu客户端:

    apt-get -y install python-pip python-ldap
    pip install ssh-ldap-pubkey
    sh -c 'echo "AuthorizedKeysCommand /usr/local/bin/ssh-ldap-pubkey-wrapper\nAuthorizedKeysCommandUser nobody" >> /etc/ssh/sshd_config' && service ssh restart
    

    创建测试密钥:

    ssh-keygen -t rsa
    
    • 4

相关问题

  • 如何最好地设置 ssh 隧道以访问远程网络 (Linux)

  • SSH 和重定向

  • 通过 SSH 会话使用 NET USER 命令拒绝访问

  • SSH 服务器零日漏洞利用 - 保护自己的建议

  • ubuntu apt-get upgrade - 如何在 shell 中单击确定?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve