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を構成してこれを実装するにはどうすればよいですか?
最初に、ユーザーの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 )
)
_
スクリプトは、そのユーザーの公開鍵を出力する必要があります。例:
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
を追加しました
これは完全な答えではなく、単に 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
Ldapsearchを実行しているときにエラーが発生する場合:
sed: 1: "/^ /{H;d};": extra characters at the end of d command
(FreeBSDの場合)と同様に、修正は最初のsedコマンドを次のように変更することです。
/^ /{H;d;};
(「d」の後にセミコロンを追加します)。
私の「メソッド」を共有したかったのですが、クライアント側は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