web-dev-qa-db-ja.com

LDAPを使用したSSHキー認証

要するに:

LDAPを介してSSHキー認証を行う方法が必要です。

問題:

ディレクトリサービスにはLDAP(slapd)を使用しており、最近ではインスタンスの構築に独自のAMIを使用するようになりました。 AMIビットが重要な理由は、理想的には、インスタンスが実行されてすぐにキー認証を介してSSHでログインでき、待機する必要がないことです。スクリプトをキックオフしてインスタンスに正しいキーを追加する、やや遅い構成管理ツール。

理想的なシナリオは、ユーザーをLDAPに追加するときに、ユーザーのキーも追加し、ユーザーがすぐにログインできるようにすることです。

キーベースの認証は必須です。パスワードベースのログインは安全性が低く、面倒です。

私は読んだ この質問 これは、これを行うためのOpenSSH-lpkと呼ばれるOpenSSHのパッチがあることを示唆していますが、これはOpenSSHサーバーではもはや必要ありません> = 6.2

Sshd_config(5)オプションAuthorizedKeysCommandを追加して、ファイルシステムに加えて(またはその代わりに)コマンドからのauthorized_keysのフェッチをサポートします。コマンドは、AuthorizedKeysCommandUser sshd_config(5)オプションで指定されたアカウントで実行されます

OpenSSHとLDAPを構成してこれを実装するにはどうすればよいですか?

64
c4urself

LDAPを更新してOpenSSH-LPKスキーマを含める

最初に、ユーザーのsshPublicKey属性を追加するスキーマでLDAPを更新する必要があります。

_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サーバーへのパスワード認証のみを許可

役立つリンク:

編集:推奨TRS-80としてユーザーnobodyを追加しました

70
c4urself

これは完全な答えではなく、単に 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
5
mbrgm

Ldapsearchを実行しているときにエラーが発生する場合:

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

(FreeBSDの場合)と同様に、修正は最初のsedコマンドを次のように変更することです。

/^ /{H;d;};

(「d」の後にセミコロンを追加します)。

5
Scott

私の「メソッド」を共有したかったのですが、クライアント側はDebian/Ubuntu固有ですが、サーバー側は基本的に上記と同じですが、もう少し「ハウツー」が追加されています。

サーバー:

公開鍵属性を有効にする:

クレジット:

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公開鍵でユーザーを追加する

まず、「Generic:User Account」テンプレートでユーザーを作成します。次に、「objectClass」属性セクションに移動し、「値を追加」をクリックして、「ldapPublicKey」属性を選択します。送信後、ユーザー編集ページに戻り、上部の[新しい属性を追加]をクリックし、[sshPublicKey]を選択して、公開鍵をテキスト領域に貼り付け、最後に[オブジェクトの更新]をクリックします。

sshPublicKey属性が表示されない-OpenLDAP PHPLDAP SSH Key Auth

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