OpenSSH 2要素認証とKerberos / 公開鍵の組み合わせ

OpenSSH 2要素認証とKerberos / 公開鍵の組み合わせ

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 コードを使用できます。

Duo Unix 構成

答え2

  • 既存の有効な Kerberos チケットを持つユーザーには、2 番目の要素のみを要求されます。

これは PAM では実現できません。

sshd に対して実行されたキーベースの認証が成功すると、authPAM のスタックがバイパスされます。これには、チケット ベースの 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

関連情報