web-dev-qa-db-ja.com

Kerberos /公開鍵と組み合わせたOpenSSH2要素認証

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がデプロイされています。仕様は次のとおりです。

  • 既存の有効なKerberosチケットを持っているユーザーは、2番目の要素についてのみ尋ねる必要があります
  • 既存の有効なKerberosチケットを持たないユーザーは、パスワードと2番目の要素の両方を要求する必要があります
  • ローカルユーザー(LDAP不可)は、ローカルパスワードで認証できる必要があります
  • 2番目の要素は最初の要素の前に提供してはなりません
  • 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

ですから、私のシナリオは決して複雑でも野心的でもないと思いますが、何日も研究と実験をしてきましたが、それを実装する明確な方法を見つけることができませんでした。解決策を見つけてください。

事前にどうもありがとうございました!

5
dgyuri92

新しいpamモジュールを作成せずにPAMでやりたいことを行う方法を私は知りません。 PAMは比較的複雑であり、sshdがPAMおよびkerberosと相互作用する方法は私の経験ではあり、常に機能しないEdgeケースが存在します。

あなたが望むことは可能かもしれません、私はそれを行う方法がわかりません。 sshを保護するだけでよい場合は、私が提案するのは

ForceCommand  /path/to/2fa_executable 

sshd_configで。これにより、必要なロジックを実装できます。欠点は、2fa_executableを設定して2faシークレットを読み取る必要があることです。

DuoSecurityのWebサイトに例とコードがあります。デュオsetuidラッパーと使用している2faコードを使用できます。

Duo Unix構成

  • 既存の有効なKerberosチケットを持っているユーザーは、2番目の要素についてのみ尋ねる必要があります。

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

Sshdに対して実行されたキーベースの認証が成功すると、PAMのauthスタックがバイパスされます。これには、チケットベースのKerberos認証の要件であるGSSAPIが含まれます。 PAMはこのタイプの認証を念頭に置いて設計されていないため、これを行う以外に選択肢はありません。

設定UsePAM yesは次のことを行います:

  • ChallengeResponseAuthenticationPasswordAuthenticationは、PAMのauthスタックをフックして、パスワードを検証します。これらの2つの方法以外の認証の形式は、notauthスタックに接触します。
  • 認証が成功すると、PAMのaccountスタックが呼び出され、認証されたユーザーがアクセスを許可されているかどうかが判断されます。 (常に)
  • PAMのsessionスタックは、セッションセットアップタスクを処理するために呼び出されます。

概要:GSSAPIまたはsshキーで認証されたユーザーに対して、authスタック内にある2要素認証プロンプトを起動する方法はまったくありません。 accountおよびsessionスタックをこれらの認証方法と組み合わせて使用​​できますが、それはPAMが行う限りです。

1
Andrew B

これがそれを行う方法の説明です https://cern-cert.github.io/pam_2fa/

  • 基本:PAMによる2要素認証
  • 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

0
user520702