ラベル ssh の投稿を表示しています。 すべての投稿を表示
ラベル ssh の投稿を表示しています。 すべての投稿を表示

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 と連携することでより複雑なチャレンジレスポンス認証が実装できます

あとはこのスクリプトをより改良して外部の認証機構と連携したりすることができます

2026年3月28日土曜日

Ubuntu で pam 認証を有効にする

Ubuntu で pam 認証を有効にする

概要

PAM (Pluggable Authentication Modules) は通常の sshd 認証と違い外部の認証機構などを使って認証する仕組みです
sshd と組み合わせることで OTP などを実現できます
今回は Ubuntu 24.04 で pam を設定する方法を紹介します

環境

  • macOS 26.3.1
  • docker 29.3.0
    • Ubuntu 24.04

pam.d/sshd

# PAM構成の基本
auth       required     pam_unix.so nullok_secure
account    required     pam_unix.so
session    required     pam_unix.so
session    required     pam_loginuid.so

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

# PAM設定コピー
COPY pam.d/sshd /etc/pam.d/sshd

EXPOSE 22

CMD ["/usr/sbin/sshd", "-D"]

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

最後に

Ubuntu24.04 の sshd の場合設定が少し特殊なので注意しましょう
基本はデフォルトを削除し新規に作成するのが確実です

次回は pam を使ってチャレンジレスポンス認証を試します

2025年12月10日水曜日

linuxserver openssh-server にパスワードなしでログインする方法

linuxserver openssh-server にパスワードなしでログインする方法

概要

鍵を作成し登録してあげます

環境

  • macOS 15.7.1
  • docker 29.1.2
  • linuxserver/openssh-server 10.0_p1-r10-ls211

compose.yaml

services:
  ssh_server:
    image: ghcr.io/linuxserver/openssh-server
    container_name: ssh_server
    ports:
      - "2222:2222"
      - "10022:10022" # SSHリモートポートフォーワードトンネル用
    environment:
      - PUID=1000
      - PGID=1000
      - PASSWORD_ACCESS=false
      - USER_NAME=operator
      - PUBLIC_KEY_FILE=/config/ssh/authorized_keys
    volumes:
      - ./custom-cont-init.d:/custom-cont-init.d:ro
      - ./config/ssh:/config/ssh
    restart: unless-stopped

custom-cont-init.d/01-sshd-config.sh

#!/bin/bash

echo "[custom-init] modifying sshd_config..."

# 対象ファイル
SSHD_CONFIG="/config/sshd/sshd_config"

# Agent Forwarding
sed -i 's/#AllowAgentForwarding yes/AllowAgentForwarding yes/' "$SSHD_CONFIG"

# TCP Forwarding
sed -i 's/AllowTcpForwarding no/AllowTcpForwarding yes/' "$SSHD_CONFIG"

# GatewayPorts
sed -i 's/GatewayPorts no/GatewayPorts yes/' "$SSHD_CONFIG"

# X11Forwarding──
sed -i 's/X11Forwarding no/X11Forwarding yes/' "$SSHD_CONFIG"

echo "[custom-init] done."
  • chmod +x config/custom-cont-init.d/01-sshd-config.sh

鍵作成

  • ssh-keygen -t ed25519 -f operator_key
  • mkdir -p config/ssh
  • mv operator_key.pub config/ssh/authorized_keys

動作確認

  • docker compose up -d
  • chmod 600 operator_key
  • ssh -i operator_key operator@localhost -p 2222

ホストの警告が出る場合は以下で無視しましょう

  • ssh -i operator_key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null operator@localhost -p 2222

リモートSSHトンネルは以下

  • ssh -i operator_key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -N -R 10022:localhost:22 operator@192.168.1.100 -p 2222

最後に

ログインしたいサーバに鍵を渡しましょう

2025年12月9日火曜日

linuxserver openssh-server でリモートフォーワードを有効にする方法

linuxserver openssh-server でリモートフォーワードを有効にする方法

概要

デフォルトだと無効になっています

環境

  • macOS 15.7.1
  • docker 29.1.2
  • linuxserver/openssh-server 10.0_p1-r10-ls211

compose.yaml

services:
  ssh_server:
    image: ghcr.io/linuxserver/openssh-server
    container_name: ssh_server
    ports:
      - "2222:2222"
      - "10022:10022" # SSHリモートポートフォーワードトンネル用
    environment:
      - PUID=1000
      - PGID=1000
      - PASSWORD_ACCESS=true
      - USER_NAME=test
      - USER_PASSWORD=mypass
    volumes:
      - ./custom-cont-init.d:/custom-cont-init.d:ro
    restart: unless-stopped

custom-cont-init.d/01-sshd-config.sh

#!/bin/bash
# chmod +x config/custom-cont-init.d/01-sshd-config.sh を必ず実行

echo "[custom-init] modifying sshd_config..."

# AllowAgentForwarding
sed -i 's/#AllowAgentForwarding yes/AllowAgentForwarding yes/g' /config/sshd/sshd_config

# AllowTcpForwarding
sed -i 's/AllowTcpForwarding no/AllowTcpForwarding yes/g' /config/sshd/sshd_config

# GatewayPorts
sed -i 's/GatewayPorts no/GatewayPorts yes/g' /config/sshd/sshd_config

# X11Forwarding
sed -i 's/X11Forwarding no/X11Forwarding yes/g' /config/sshd/sshd_config

echo "[custom-init] done."
  • chmod +x config/custom-cont-init.d/01-sshd-config.sh

動作確認

  • docker compose up -d
  • docker compose exec ssh_server cat /config/sshd/sshd_config

GatewayPorts などが yes になっていることを確認します

最後に

カスタムスクリプトを配置するパスが /custom-cont-init.d でした
バージョンによって異なるのでご注意ください

参考サイト

2025年12月8日月曜日

ssh できるコンテナを気軽に立てる方法

ssh できるコンテナを気軽に立てる方法

概要

Mac などで ssh サーバを立てるのが面倒な場合に docker で簡単に構築できます

環境

  • macOS 15.7.1
  • docker 29.1.2
  • linuxserver/openssh-server 10.0_p1-r10-ls211

起動

docker run -d \
  -p 2222:2222 \
  -e PASSWORD_ACCESS=true \
  -e USER_PASSWORD=mypass \
  ghcr.io/linuxserver/openssh-server

ログイン

  • ssh linuxserver.io@192.168.1.100 -p 2222

ユーザを指定する

docker run -d \
  -p 2222:2222 \
  -e PASSWORD_ACCESS=true \
  -e USER_PASSWORD=mypass \
  -e USER_NAME=test \
  ghcr.io/linuxserver/openssh-server
  • ssh test@192.168.1.100 -p 2222

最後に

ssh の検証するときには便利です

参考サイト

2024年12月17日火曜日

Rlogin で多段 ssh する方法

Rlogin で多段 ssh する方法

概要

ProxyJump や ProxyCommand 的なことはできないっぽいので localhost にポートフォーワードしてそれをプロキシして次のサーバにつなぐのが主流なようです

なのでサーバ側でローカルポートフォーワードを許可していない場合には何か別の方法を模索する必要があります

環境

  • Rlogin 2.29.1

踏み台となるマシンの登録

ファイル -> サーバに接続 -> 新規で登録します

サーバー

  • エントリー(上) -> 好きな名前の設定
  • ホスト名 -> 踏み台マシンのIP
  • TCPポート -> 踏み台マシンのsshポート
  • ログインユーザ名 -> 踏み台マシンにログインするユーザ名
  • パスワード or パスフレーズ -> 踏み台マシンにログインするパスワード

あとは鍵などが必要であれば鍵を設定してください

サーバー(プロトコル)

サーバー -> プロトコル -> ポートフォーワード -> 新規で設定します

  • Listened -> Local Proxy Server
  • Host -> localhost
  • Port -> 10001 (空いてそうで競合しなさそうな localhost のポートならどこでもOK)

ポイントは踏み台に ssh した上で更に localhost の windows にポートフォーワードする設定もする点です

実際にsshするマシンの登録

ファイル -> サーバに接続 -> 新規で登録します

サーバ

  • エントリー(上) -> 好きな名前の設定
  • 前接続先(下) -> 先ほど登録した踏み台マシンの名前
  • ホスト名 -> sshするマシンのIP
  • TCPポート -> sshするマシンのsshポート
  • ログインユーザ名 -> sshするマシンにログインするユーザ名
  • パスワード or パスフレーズ -> sshするマシンにログインするパスワード

異なるのは踏み台マシンを「前接続先」とやらに設定する点です

プロキシ設定

サーバー -> プロキシ設定で設定します
先ほどの踏み台マシンで localhost にポートフォーワードしたポートをプロキシに設定します

  • Select Proxy Protocol -> SOCKS5
  • Proxy Server Address -> localhost
  • Socket Port -> 10001

動作確認

あとはサーバー接続の一覧から実際にsshするマシンを選択すれば踏み台->sshするマシンの順番で認証などが聞かれるので認証すればsshできるはずです

なおターミナルを閉じるときに localhost にポートフォーワードしたプロセスも閉じるように聞かれるので一緒に閉じましょう

同じような感じで踏み台が複数ある場合はその分だけローカルにポートフォーワードして次のマシンには踏み台の順番にプロキシを設定すれば 3,4段と多段の ssh もできるかなと思います

最後に

踏み台マシンがsshのポートフォーワードを許可していない場合にはどうすればいいのだろうか

踏み台マシンに nc などがあれば ProxyCommand が使えるが Rlogin で ProxyCommand 的なことはできるのだろうか

また ssh -W でも ssh 的には多段 ssh を実施できるが結局 ProxyCommand が必要になるので厳しそう

幸いにも Rlogin は日本人の開発者っぽいので最悪自分で開発すればいいのだと思う

参考サイト

2023年12月8日金曜日

SSH のローカルポートフォーワードで channel 2: open failed: connect failed: Temporary failure in name resolution エラー

SSH のローカルポートフォーワードで channel 2: open failed: connect failed: Temporary failure in name resolution エラー

概要

対処方法を紹介します

環境

  • Windows10

対処方法 .ssh/config の Host と Hostname を IP 指定にする

接続できる例

Host 192.168.100.1
     Hostname 192.168.0.1
     Port 22
     User root
     IdentityFile /path/to/secret.pem
     ProxyCommand ssh proxy /bin/nc %h %p
  • ssh -N -L 5000:192.168.100.1:9090 192.168.100.1

接続できない例

Host ins01
     Hostname 192.168.0.1
     Port 22
     User root
     IdentityFile /path/to/secret.pem
     ProxyCommand ssh proxy /bin/nc %h %p
  • ssh -N -L 5000:ins01:9090 ins01

最後に

普通に ssh する場合は Host と Hostname が違っていても問題ないのですがポートフォーワードする場合は IP で指定したほうが無難のようです