2026年3月29日日曜日

sshd でチャレンジレスポンス認証を試す

sshd でチャレンジレスポンス認証を試す

概要

前回 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 件のコメント:

コメントを投稿