OpenSSHに2要素認証を実装しようとしています。環境はCentos7(カーネル:3.10.0-229.1.2.el7.x86_64)で、OpenSSH_6.6.1p1、OpenSSL 1.0.1e-fips 2013年2月11日です。ActiveDirectory(LDAP)+ 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も存在するため、私にはKerberosOrLocalPasswdyesステートメントが無視されているように見えます。ただし、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
ですから、私のシナリオは決して複雑でも野心的でもないと思いますが、何日も研究と実験をしてきましたが、それを実装する明確な方法を見つけることができませんでした。解決策を見つけてください。
事前にどうもありがとうございました!
新しいpamモジュールを作成せずにPAMでやりたいことを行う方法を私は知りません。 PAMは比較的複雑であり、sshdがPAMおよびkerberosと相互作用する方法は私の経験ではあり、常に機能しないEdgeケースが存在します。
あなたが望むことは可能かもしれません、私はそれを行う方法がわかりません。 sshを保護するだけでよい場合は、私が提案するのは
ForceCommand /path/to/2fa_executable
sshd_configで。これにより、必要なロジックを実装できます。欠点は、2fa_executableを設定して2faシークレットを読み取る必要があることです。
DuoSecurityのWebサイトに例とコードがあります。デュオsetuidラッパーと使用している2faコードを使用できます。
- 既存の有効なKerberosチケットを持っているユーザーは、2番目の要素についてのみ尋ねる必要があります。
これは、PAMでは実現できません。
Sshdに対して実行されたキーベースの認証が成功すると、PAMのauth
スタックがバイパスされます。これには、チケットベースのKerberos認証の要件であるGSSAPIが含まれます。 PAMはこのタイプの認証を念頭に置いて設計されていないため、これを行う以外に選択肢はありません。
設定UsePAM yes
は次のことを行います:
ChallengeResponseAuthentication
とPasswordAuthentication
は、PAMのauth
スタックをフックして、パスワードを検証します。これらの2つの方法以外の認証の形式は、notauth
スタックに接触します。account
スタックが呼び出され、認証されたユーザーがアクセスを許可されているかどうかが判断されます。 (常に)session
スタックは、セッションセットアップタスクを処理するために呼び出されます。概要:GSSAPIまたはsshキーで認証されたユーザーに対して、auth
スタック内にある2要素認証プロンプトを起動する方法はまったくありません。 account
およびsession
スタックをこれらの認証方法と組み合わせて使用できますが、それはPAMが行う限りです。
これがそれを行う方法の説明です https://cern-cert.github.io/pam_2fa/
Ssh認証方法の詳細を理解するpamモジュール:
auth [success = 2 ignore = ignore default = die] pam_ssh_user_auth.so
これをpamに公開するための最近またはパッチが適用されたOpenSSH
AuthenticationMethods gssapi-with-mic、keyboard-interactive:pam publickey、keyboard-interactive:pamkeyboard-interactive:pam