完全な公開:
私は自分で答えるためにこの質問を書いています。一日中インターネットを検索しましたが、私に合った解決策が見つかりませんでした。さらにロギングを追加するために、独自のGoogleAuthenticator PAMモジュールをコンパイルしました。 OpenVPNプロセスとそのサブプロセスを実行せずに
strace
ソリューションを見つけました。
ユースケース
- EC2でOpenVPNを使用してVPNを起動する
- PAM GoogleAuthenticatorモジュールの使用
- オペレーティングシステム:CentOS
設定
- EC2にログイン
- クライアントの作成
- 提供されたトークンジェネレータを使用してユーザー(クライアント)にMFAトークンを追加し、このトークンをPAMモジュールが検出できる正しい場所に保存します。
<user>.ovpn
このユーザー用のファイルの作成
次のスクリプトはLinuxユーザーを作成し、MFAキーを生成し、それをPAM構成で指定された場所に保存します。権限は、600
私がMFA_USER
作成した事前に作成されたユーザー名です。gauth
function generate_mfa() {
user_id=$1
if [ "$user_id" == "" ]; then
echo "ERROR: No user id provided to generate MFA token" >&2
exit 1
fi
echo "INFO: Creating user ${user_id}" >&2
useradd -s /bin/nologin "$user_id"
echo "> Please provide a password for the user" >&2
passwd "$user_id"
echo "INFO: Generating MFA Token" >&2
google-authenticator -t -d -r3 -R30 -f -l "${MFA_LABEL}" -s "${MFA_DIR}/${user_id}"
chown "${MFA_USER}:${MFA_USER}" "$MFA_DIR/${user_id}"
chmod 600 "${MFA_DIR}/${user_id}"
}
OpenVPN PAMの設定
auth required /usr/lib64/security/pam_google_authenticator.so secret=/etc/openvpn/google-authenticator/${USER} user=gauth forward_pass
auth include system-auth use_first_pass
account include system-auth use_first_pass
password include system-auth use_first_pass
session include system-auth use_first_pass
auth required pam_deny.so
質問
- 自分で設定されたTunnelblickを使用すると、
client.ovpn
自分のユーザー名とパスワードでログインするように求められます。- パスワードの形式は inline: であり、ディレクティブによって
<password><MFA_TOKEN>
削除されます。forward_pass
- パスワードの形式は inline: であり、ディレクティブによって
- 正しい資格情報を入力しても承認されていないメッセージが表示されます。
丸太
- 私の問題を確認するために、SSHを介してVPNインスタンスにログインし、PAM /認証ログを確認しました。
tail /var/log/secure
Sep 10 22:33:43 ip-OMITTED openvpn(pam_google_authenticator)[12862]: Accepted google_authenticator for ryan
Sep 10 22:33:43 ip-OMITTED openvpn(pam_google_authenticator)[12862]: Failed to update secret file "/etc/openvpn/google-authenticator/ryan": Permission denied
ああ! 「許可が拒否されました」
その後、私の権限を確認してください。
[root@ip-OMITTED centos]# ls -lah /etc/openvpn/google-authenticator/
drwxr-xr-x. gauth gauth .
drwxr-xr-x. root root ..
-rw-------. gauth gauth ryan
- まあ、権限が
600
正しいようです。このディレクトリは実行可能であり、gauth
PAM構成でこのユーザーを使用します。
私の構成にはどのような問題がありますか?
- ユーザーが
gauth
存在します:check:
- 権限が正しい
:check:
ベストアンサー1
アハ瞬間
.
私の権限リストの最後にあるものは何ですか?
[root@ip-OMITTED centos]# ls -lah /etc/openvpn/google-authenticator/
drwxr-xr-x. gauth gauth .
drwxr-xr-x. root root ..
-rw-------. gauth gauth ryan
...Searchin' the web...
- ということがあるようです。SELinux(セキュリティが強化されたLinux)
それls -lah
ファイルの特別なコンテキスト/ACLコンテンツがあることを示すランタイムファイルの権限の末尾にあります。
望むより:SELinuxドキュメント
したがって、コンテキストを表示するには、次のようにします。
ls -Z
ログインする前に
ファイルコンテキストはunconfined_u:object_r:openvpn_etc_t:s0
[root@ip-OMITTED centos]# ls -lahZ /etc/openvpn/google-authenticator/
drwxr-xr-x. gauth gauth unconfined_u:object_r:openvpn_etc_t:s0 .
drwxr-xr-x. root root system_u:object_r:openvpn_etc_t:s0 ..
-rw-------. gauth gauth unconfined_u:object_r:openvpn_etc_t:s0 ryan
- その後、一時的にselinuxを無効にしました。
setenforce 0
1回のログイン後
ファイルが書き込まれ、コンテキストが強制的に作成されます。 system_u:object_r:openvpn_etc_rw_t:s0
[root@ip-OMITTED centos]# ls -lahZ /etc/openvpn/google-authenticator/
drwxr-xr-x. gauth gauth unconfined_u:object_r:openvpn_etc_t:s0 .
drwxr-xr-x. root root system_u:object_r:openvpn_etc_t:s0 ..
-r--------. gauth gauth system_u:object_r:openvpn_etc_rw_t:s0 ryan
SELinuxを再度有効にします。
setenforce 1
まだログインできます。 :)
SELinuxがオンのときにファイルを回復するには、次のコマンドを実行します。
semanage fcontext -a -t openvpn_etc_rw_t "${MFA_DIR}/${user}"
restorecon "${MFA_DIR}/${user}"
- これは
rw
ビットを許可します!