n-factor
CentOS 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/sshd
。 2ndfactor.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/sshd
CentOS 7にはデフォルトで含まれていません。@include common-auth
また、@steveのリンクはphpスクリプトのWeb URLを使用していますが、シェルスクリプトからjavaプログラムを呼び出そうとします。 URLを公開せずにこれを行う方法が必要です。
ChallengeResponseAuthentication = yes
最後に、@steveのリンクにはinディレクトリを設定する必要がありますが、/etc/ssd/sshd_config
CentOS 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