OpenSSH に 2 要素認証を実装しようとしています。環境は Centos 7 (カーネル: 3.10.0-229.1.2.el7.x86_64)、OpenSSH_6.6.1p1、OpenSSL 1.0.1e-fips 2013 年 2 月 11 日です。Active Directory (LDAP) + Kerberos を導入しています。仕様は次のとおりです。
- 既存の有効なKerberosチケットを持つユーザーには、2番目の要素のみを要求される必要があります。
- 有効なKerberosチケットを持たないユーザーには、パスワードと2番目の要素の両方を要求される必要がある。
- ローカルユーザー(LDAPアカウントなし)はローカルパスワードで認証できる必要があります
- 2番目の要素は1番目の要素より先に提示してはならない
- Kerberos に加えて、公開鍵認証も、利用可能な場合は第一要素として受け入れられるべきである。
- この機能は特定のユーザーのみに制限できる必要があります。他のユーザーはパスワードを入力するだけでログインできます。
2 番目の要素の認証プロセスを実行するために、Kerberos について何も知らないサードパーティの PAM モジュールが利用可能です。そこで、私が行ったことは次のとおりです。
次の行を /etc/ssh/sshd_config に追加します。
# To enable PAM - this will make sshd use PAM with configuration /etc/pam.d/sshd
UsePam yes
ChallengeResponseAuthentication yes
# To enable Kerberos and public key authentication - it will let sshd use existing Kerberos tickets
GSSAPIAuthentication yes
# Enable public key authentication
PubkeyAuthentication yes
# Password validation should be done via the KDC
PasswordAuthentication yes
KerberosAuthentication yes
KerberosOrLocalPasswd yes
# Kerberos / Public Key + PAM
AuthenticationMethods gssapi-with-mic,keyboard-interactive:pam publickey,keyboard-interactive:pam password,keyboard-interactive:pam
# (only supported for OpenSSH 6.2 or higher)
sshd の PAM 設定の auth セクション (/etc/pam.d/sshd)
auth [success=ignore default=1] pam_localuser.so
auth substack password-auth
auth [success=1 default=ignore] pam_localuser.so
auth required pam_2fa.so [...some arguments...]
auth include postlogin
モジュール pam_2fa.so は、2 番目の要素の入力を要求し、検証する役割を担います。
Kerberos の場合、これでほぼ目的のすべてが達成されます。ただし、ローカル アカウントの場合、パスワード プロンプトが 2 回表示されます。これがここでの主な問題です。これは、この場合、パス "password,keyboard-interactive:pam" が予想どおり使用されるためです (この認証パスが必要なのは、Kerberos アカウントを持っているが有効なチケットを持っていないユーザーが、パスワードを入力してから OTP を入力することでチケットを取得できるようにするためです)。PAM 構成から password-auth サブスタックを完全に削除すると、Kerberos アカウントは引き続き機能しますが、ローカル アカウントは機能しません。私には、UsePAM yes も存在するため、KerberosOrLocalPasswd yes ステートメントが無視されているように見えます。ただし、sshd は実際にはパスワード検証に KDC を使用し続けます。そうしないと、LDAP アカウントでも機能しないためです。
繰り返しになりますが、ここで実装したいことをさらに明確にするために、必要な認証ロジックを記述した疑似コードを示します。
if gssapi_auth_ok(principal) or pubkey_auth_ok(pubkey):
return second_factor_auth(user, read_otp())
else:
if is_local_account(user):
if local_passwd_auth(user, read_password()):
return second_factor_auth(user, read_otp())
else:
return AUTH_ERR
else:
if krb5_auth(principal, read_password()):
return second_factor_auth(user, read_otp())
return AUTH_ERR
私のシナリオはそれほど複雑でも野心的でもないと思いますが、何日もかけて調査と実験を行ったにもかかわらず、それを実装する明確な方法を見つけることができませんでした。解決策を見つけるのを手伝っていただけますか?
事前にどうもありがとうございました!
答え1
新しい pam モジュールを作成せずに PAM で必要なことを実行する方法は知りません。PAM は比較的複雑であり、sshd が PAM および Kerberos と対話する方法は、私の経験では、機能しないエッジ ケースが常に存在するようなものでした。
あなたが望むことは可能かもしれませんが、やり方がわかりません。SSHを安全にするだけなら、私が提案するのは
ForceCommand /path/to/2fa_executable
sshd_config で。これにより、必要なロジックを実装できますが、欠点は、2fa シークレットを読み取るために 2fa_executable を setuid する必要があることです。
Duo Security の Web サイトに例とコードがあります。duo setuid wrapper と、使用している 2fa コードを使用できます。
答え2
- 既存の有効な Kerberos チケットを持つユーザーには、2 番目の要素のみを要求されます。
これは PAM では実現できません。
sshd に対して実行されたキーベースの認証が成功すると、auth
PAM のスタックがバイパスされます。これには、チケット ベースの Kerberos 認証の要件である GSSAPI が含まれます。PAM は、このタイプの認証を念頭に置いて設計されていないため、これを行う以外に選択肢はありません。
設定によりUsePAM yes
次のことが行われます。
ChallengeResponseAuthentication
そしてPAMのスタックPasswordAuthentication
をフックしてauth
パスワードを検証します。これら2つの方法以外の認証方法はないスタックをタッチしますauth
。- 認証が成功すると、
account
認証されたユーザーにアクセスが許可されているかどうかを判断するために PAM のスタックが呼び出されます。(常に) - セッション設定タスクを処理するために PAM のスタック
session
が呼び出されます。
auth
要約: GSSAPI または SSH キーで認証したユーザーに対して、スタック内にある 2 要素認証プロンプトを起動する方法はまったくありません。account
およびsession
スタックをこれらの認証方法と組み合わせて使用することはできますが、PAM でできることはそれだけです。
答え3
やり方の説明はこちらhttps://cern-cert.github.io/pam_2fa/
- 基礎: PAM による 2 要素認証
SSH 認証方法についてより詳しく理解する pam モジュール:
認証 [成功=2 無視=無視 デフォルト=終了] pam_ssh_user_auth.so
これを pam に公開するための最新またはパッチを当てた OpenSSH
認証方法 gssapi-with-mic、keyboard-interactive:pam publickey、keyboard-interactive:pam keyboard-interactive:pam