CentOS 7のn-Factor SSH認証

CentOS 7のn-Factor SSH認証

n-factorCentOS 7サーバーへのすべてのSSH接続に対して認証を有効にして要求する方法は?

私は以下を提供するGoogle OTPについて読んだ。二つ要素認証ただし、これは各ユーザーのモバイルデバイスにインストールする必要があるアプリによって提供されるピンに制限されます。

可変数の認証要素を追加するには?他の要因のいくつかの例は次のとおりです。

1.) a pin code emailed to the administrator's work email address
2.) a USB key
3.) a pin texted to the administrator using a tool like twilio
etc.) ...

ピンEメールとテキストを送信するJavaプログラムは構築が簡単で、デフォルトのSSH認証スクリプトを置き換えるシェルスクリプトから呼び出すことができますが、以前にシェルスクリプトを書いたことはありません。

Javaがすでに作成されていると仮定すると、これを行うシェルコードはどのようなものでしょうか?シェルスクリプトをどこに置くべきですか? シェルスクリプトの擬似コードには、次の手順を含めることができます。

1.) Trigger the Java program to send email, text, etc. with custom pins 
        when administrator types ssh [email protected]
2.) Replace the login password prompt with a series of prompts to  
        get the pins/credentials from
2.) Possibly interact with a client program to get the usb signature
3.) Send the credentials to the java program, with time stamp to ensure  
        login was done within a minute after java sent the pins
4.) Compare the Boolean returned by the java program with the CentOS password check
5.) Either authenticate or reject the user

シェルスクリプトの最初のドラフトの私の推測は次のとおりです。

#!/bin/bash
USER_NAME=#How do I populate this?
TEXT_PIN=shuf -i 1-10000 -n 1
EMAIL_PIN=shuf -i 1-10000 -n 1
CLASSPATH=/path/to/classes
java -cp $CLASSPATH my.package.SendPinsClass TEXT_PIN EMAIL_PIN
if [ $? -eq 0 ]
then
    echo -n "We were not able to send authentication credentials.  Please log the current time and report this to the chief administrator. "
else
    echo -n "Pin numbers have been sent to your email and phone number.  Please check your email and text messages now before continuing the authentication process. "
fi

echo -n "Enter Pin number from cell phone: "
read TEXT_PIN
echo -n "Enter Pin number from email: "
read EMAIL_PIN
java -cp $CLASSPATH my.package.AuthenticationClass USER_NAME TEXT_PIN EMAIL_PIN
if [ $? -eq 0 ]
then
    #DO NOT AUTHENTICATE
else
    #LOG THIS USER IN!
fi
#HOW DO WE CHECK THE USER'S CentOS 7 PASSWORD?
#THIS SCRIPT MUST INCLUDE A PASSWORD CHECK IN AUTHENTICATION PROCESS.

シェルスクリプトには何が含まれていますか?どのように配置するのですか?

仕様は回答上記のように。しかし、コメント独自のツールを開発するよりも簡単なツールの提案も歓迎します。コメント


編集する:


進行中の研究に基づいて、上記のドラフトシェルスクリプトにより明示的な詳細を追加して、スクリプトがユーザーを認証するために実行する必要がある手順を文書化しました。シェルスクリプトによって呼び出される2つの「ブラックボックス」Javaプログラムによって、重要なステップが正常に完了したと想定できます。完了する前に答える必要がある残りの主な質問は次のとおりです。

1.) How does the script receive and populate the value for the USER_NAME variable?
2.) How does the script check the user's CentOS 7 OS password, and 
        how should the password be integrated into the script's authentication 
        process?  Note the security of the password needs to be protected.
3.) How does the script process the approval or rejection of the  
        authentication request with the CentOS 7 operating system?
4.) How is the working shell script placed in the authentication  
        process to replace the default authentication script?  

注:CentOS 7でスクリプトの実装にPAM module@steveがコメントで示唆したようにスクリプトバンドルが含まれている場合、許可された答えはシェルスクリプトの変更だけでなく、シェルスクリプトを他の側面PAM moduleに統合するための明示的なガイドラインを提供する必要があります。認証プロセス中。答えはCentOS 7で実行する必要があります。


2番目の編集:


以下のコメントに@steveが投稿したリンクによると、基本的な内容は/etc/pam.d/sshd次のとおりです。

#%PAM-1.0
auth       required     pam_sepermit.so
auth       substack     password-auth
auth       include  postlogin
account    required     pam_nologin.so
account    include  password-auth
password   include  password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    optional     pam_keyinit.so force revoke
session    include  password-auth
session    include  postlogin

CentOS 7には/lib/security/そのような場所がないため、@steveのリンク(Debianの場合)のようにPAMモジュールの場所ではありません。したがって、PAMモジュールがないと、OPにシェルスクリプトを保存することはできません/lib/security/2ndfactor.so。 @steveリンクのチュートリアルでは、次のコードを使用してスクリプトを/lib/security/2ndfactor.so

apt-get update
apt-get install build-essential libpam0g-dev libcurl4-openssl-dev
gcc -fPIC -lcurl -c 2ndfactor.c
ld -lcurl -x --shared -o /lib/security/2ndfactor.so 2ndfactor.o

@steveのリンクは、次のようにafterへの参照を追加するように編集することを提案します/etc/pam.d/sshd2ndfactor.o@common-auth

# PAM configuration for the Secure Shell service
# Read environment variables from /etc/environment and
# /etc/security/pam_env.conf.
auth       required     pam_env.so # [1]
# In Debian 4.0 (etch), locale-related environment variables were moved to
# /etc/default/locale, so read that as well.
auth       required     pam_env.so envfile=/etc/default/locale

# Standard Un*x authentication.
@include common-auth
auth       required     2ndfactor.so base_url=http://my.server.com/send_code.php code_size=5

しかし、上記のように、/etc/pam.d/sshdCentOS 7にはデフォルトで含まれていません。@include common-authまた、@steveのリンクはphpスクリプトのWeb URLを使用していますが、シェルスクリプトからjavaプログラムを呼び出そうとします。 URLを公開せずにこれを行う方法が必要です。

ChallengeResponseAuthentication = yes最後に、@steveのリンクにはinディレクトリを設定する必要がありますが、/etc/ssd/sshd_configCentOS 7にはディレクトリがありません/etc/ssd/

誰かがこれをCentOS 7とJavaに適用する方法を示すことができますか?

答え1

標準 *nix 認証スタックは PAM を使用します。 PAM用のモジュールの構築を検討する必要があります。 http://www.linux-pam.org/Linux-PAM-html/

通常、マルチレベル認証プロバイダーはこれを提供します。たとえば、SSH ログインの 2 番目の要素として Google Authenticator を実装する方法について説明します。 http://spod.cx/blog/two-factor-ssh-auth-with-pam_oath-google-authenticator.shtml

さまざまな十分な要素または必須要素をサポートするようにPAMを設定できます。


編集:私は難しく言うつもりはありません。ただ研究の方向を変えようとするだけです。 2番目の編集から、次を含む一連の行を調整するのに役立ちます。gcc -fPIC -lcurl -c 2ndfactor.c これは景品です。シェルスクリプトをコンパイルできません。 PAMモジュールはCで書かれており、gccを使用してコンパイルされました(この例では)。 PAMモジュール内でJavaアプリケーションを呼び出すことはできますが、これはこのサイトの範囲外であり、私が知っているわけではありません。

その他の注意事項:

  • 32ビットライブラリと64ビットライブラリが必要な場合、PAMモジュールの最新のCentOSバージョンは/ lib64 / security /にあります。
  • Lastly, @steve's link says to set ChallengeResponseAuthentication = yes in /etc/ssd/sshd_config, but in CentOS 7 there is no /etc/ssd/ directory.これはおそらく誤字です。 /etc/sshd でなければなりません。

回避策:システム管理者として、私は「奇妙な」構成を使用することをお勧めしません。 PAMはよく知られており、承認された認証方法であり、sshd以外の多くのアプリケーションでそれを使用して使用します。

ただし、ttyセッションでsshdの2FA実装にのみ興味がある場合は、sshd構成でForceCommandオプションを使用することを検討できます。 http://ben.akrin.com/?p=1290

認証されたユーザーは、後でForceCommandを介して2FAを実施するための将来の試みを比較的簡単に回避できるため、これはあまり良い解決策ではありません。 https://serverfault.com/questions/639771/how-secure-is-ssh-forcecommand-on-a-jump-host

関連情報