概要
前回 Ubuntu + pam の設定を行いました
チャレンジレスポンス認証は通常のパスワード認証と毎回違うパスワードで ssh ログインさせたりすることができます
OTP や外部の認証サーバと連携したりもできます
今回は簡単な問題をシェルスクリプトで作成しその問題が正解なら認証 OK とします
環境
- macOS 26.3.1
- docker 29.3.0
- Ubuntu 24.04
pam.d/ssh
# --- Auth Phase ---
# 1. クイズを表示
auth required pam_echo.so info Challenge: 3 + 5 = ?
# 2. スクリプト判定(8 以外ならここで拒否される)
auth required pam_exec.so expose_authtok /usr/local/bin/math_challenge.sh
# 3. 資格情報 (setcred) を与えるためのモジュール
# 前のステップが required なので、ここには「8」と打った時しか到達しません。
# これを入れることで pam_setcred(): Permission denied を防ぎます。
auth required pam_permit.so
# --- Account & Session Phase ---
account required pam_permit.so
session required pam_unix.so
session required pam_env.so
# session required pam_loginuid.so # Dockerでは引き続きコメントアウト
math_challenge.sh
#!/bin/bash
# 入力を読み取る
read -r USER_INPUT
# 判定(xargsで空白を除去)
ANSWER=$(echo "$USER_INPUT" | xargs)
if [ "$ANSWER" = "8" ]; then
# 成功時は何も出力せず exit 0
exit 0
else
# 失敗時はデバッグ用に標準エラーへ(docker logsで見れる)
echo "Auth Failed: Input was '$ANSWER'" >&2
exit 1
fi
Dockerfile
FROM ubuntu:24.04
RUN apt-get update && \
apt-get install -y openssh-server && \
mkdir /var/run/sshd
# ユーザー作成
RUN useradd -m -s /bin/bash testuser && echo "testuser:testpass" | chpasswd
# 既存設定をリセットし、必要な設定だけを新規作成
RUN rm -rf /etc/ssh/sshd_config.d/* && \
echo "Port 22" > /etc/ssh/sshd_config && \
echo "ListenAddress 0.0.0.0" >> /etc/ssh/sshd_config && \
echo "PermitRootLogin no" >> /etc/ssh/sshd_config && \
echo "KbdInteractiveAuthentication yes" >> /etc/ssh/sshd_config && \
echo "PasswordAuthentication no" >> /etc/ssh/sshd_config && \
echo "UsePAM yes" >> /etc/ssh/sshd_config
# 認証スクリプトをコピー
COPY math_challenge.sh /usr/local/bin/math_challenge.sh
RUN chmod +x /usr/local/bin/math_challenge.sh
# PAM設定を上書き
COPY pam.d/sshd /etc/pam.d/sshd
# (重要) CHALLENGE-RESPONSEを有効化
RUN sed -i 's/KbdInteractiveAuthentication no/KbdInteractiveAuthentication yes/' /etc/ssh/sshd_config
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D", "-e"]
compose.yaml
services:
ssh:
build: .
container_name: ssh-challenge
ports:
- "2222:22"
動作確認
-
docker compose up -d --build
-
ssh -o PreferredAuthentications=keyboard-interactive testuser@localhost -p 2222
これで「8」と入力すればログインできるようになります
それ以外はログインエラーになります
さすがにチャレンジするパスワードが簡単すぎるので本当はもっと複雑な問題にします
最後に
Ubuntu24.04 でチャレンジレスポンス認証を試してみました
pam と連携することでより複雑なチャレンジレスポンス認証が実装できます
あとはこのスクリプトをより改良して外部の認証機構と連携したりすることができます
0 件のコメント:
コメントを投稿