本文へ移動
vast-cowのブログ
前のページへ戻る

rootless での `sshd` の実行

この記事を編集

この記事では、root 権限なしで通常ユーザーとして sshd を実行する方法を説明します。この構成では、ユーザーのホームディレクトリ配下にカスタム設定ディレクトリを作成し、非特権ポートで待ち受けます。

概要

通常、sshd はシステムによって root として起動され、ポート 22 で待ち受けます。しかし、環境によっては root アクセスなしで SSH サーバーを実行することが有用な場合があります。ルートレス構成は、テスト、開発、またはユーザー空間での一時的なリモートアクセスに利用できます。

この例では、~/.sshd にプライベートな SSH サーバー環境を作成し、必要に応じてホストキーを生成し、最小限の sshd_config を書き込み、設定を検証したうえで、デーモンをフォアグラウンドで起動します。

ディレクトリと変数の設定

setup.sh スクリプトは、いくつかの変数を定義することから始まります:

BASE="$HOME/.sshd"
PORT=2222
SSHD="$(command -v sshd)"

BASE は SSH サーバーファイルの作業ディレクトリです。PORT は 2222 に設定されており、これは非特権ポートで、root なしで使用できます。SSHD は sshd 実行ファイルのパスを保持します。

次に、必要なディレクトリを作成します:

install -d -m 700 "$BASE" "$HOME/.ssh"

これにより、~/.sshd と ~/.ssh の両方が安全なパーミッションで存在することが保証されます。

ホストキーの生成

SSH サーバーには独自のホストキーが必要です。スクリプトは、Ed25519 ホストキーが既に存在するかを確認します:

if [ ! -f "$BASE/ssh_host_ed25519_key" ]; then
  ssh-keygen -q -t ed25519 -N '' -f "$BASE/ssh_host_ed25519_key"
fi
chmod 600 "$BASE/ssh_host_ed25519_key"

キーが存在しない場合は生成されます。その後、パーミッションは所有者のみに制限されます。これは、アクセス権が広すぎる秘密鍵を SSH が拒否するため重要です。

sshd 設定の作成

スクリプトは、ユーザー所有ディレクトリにカスタムの sshd_config ファイルを書き込みます。

cat > "$BASE/sshd_config" <<EOF
Port $PORT
ListenAddress 0.0.0.0

UsePAM no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes

HostKey $BASE/ssh_host_ed25519_key
PidFile none

PermitRootLogin no
PrintMotd no
PrintLastLog no
X11Forwarding no
AllowUsers $USER

Subsystem sftp internal-sftp
EOF

主な設定項目

ポートとリッスンアドレス

認証

これにより、SSH キーのみに依存したシンプルで安全なルートレス構成になります。

ホストキーと PID ファイル

制限

SFTP サポート

設定の検証

setup.sh の最後で、スクリプトは設定を検証します:

"$SSHD" -t -f "$BASE/sshd_config"

これはサーバー起動前に構文をチェックする有用なステップです。

SSH サーバーの起動

start.sh スクリプトは非常にシンプルです:

#!/bin/bash
BASE="$HOME/.sshd"
SSHD="$(command -v sshd)"
exec "$SSHD" -D -e -f "$BASE/sshd_config"

これが行うこと

exec を使うことで、シェルプロセスが sshd に置き換えられ、クリーンにサーバーを起動できます。

使用方法

一般的な手順は次のとおりです:

  1. setup.sh を一度実行して設定とホストキーを作成する。
  2. 公開鍵が ~/.ssh/authorized_keys に存在することを確認する。
  3. start.sh を実行して SSH サーバーを起動する。
  4. ポート 2222 で接続する。

例:

ssh -p 2222 user@host

このアプローチの利点

このルートレス SSH 構成にはいくつかの利点があります:

まとめ

この例は、root 権限なしで sshd を実行するためのコンパクトな方法を提供します。プライベートな設定ディレクトリ、非特権ポート、および公開鍵認証のみを使用することで、ユーザー空間で動作するシンプルで実用的な SSH サーバーを構築できます。

スクリプト

setup.sh

#!/bin/bash 
BASE="$HOME/.sshd" 
PORT=2222 
SSHD="$(command -v sshd)" 
 
install -d -m 700 "$BASE" "$HOME/.ssh" 
 
# server host key 
if [ ! -f "$BASE/ssh_host_ed25519_key" ]; then 
  ssh-keygen -q -t ed25519 -N '' -f "$BASE/ssh_host_ed25519_key" 
fi 
chmod 600 "$BASE/ssh_host_ed25519_key" 
 
cat > "$BASE/sshd_config" <<EOF 
Port $PORT 
ListenAddress 0.0.0.0 
 
UsePAM no 
PasswordAuthentication no 
KbdInteractiveAuthentication no 
PubkeyAuthentication yes 
 
HostKey $BASE/ssh_host_ed25519_key 
PidFile none 
 
PermitRootLogin no 
PrintMotd no 
PrintLastLog no 
X11Forwarding no 
AllowUsers $USER 
 
Subsystem sftp internal-sftp 
EOF 
 
"$SSHD" -t -f "$BASE/sshd_config" 

start.sh

#!/bin/bash 
BASE="$HOME/.sshd" 
SSHD="$(command -v sshd)" 
exec "$SSHD" -D -e -f "$BASE/sshd_config" 

この記事を編集
この記事を共有:

コメント


前の記事
NVIDIA HPC SDK環境でNCCL Testsをビルドする方法
次の記事
Singularity(Apptainer)で non-root / 非特権ポートの Samba サーバーを立てて `$HOME` を共有する