能書き
自宅サーバー構築譚:基本構想に基づく自宅サーバー構築、Ubuntu22.04LTSインストールその2の続きです。
前回はオレオレ認証局を構築しまして、公開鍵(及び秘密鍵)を作成できる環境を作りました。
ここで問題になるのが公開鍵の送付です。
セキュリティを鑑みると、最終的には ssh を公開鍵認証するようにしたいのです。しかしその為には、クライアントマシンで作成した公開鍵をサーバーマシンに送付しなければなりません。
USBメモリで物理的に運搬、でも良いのですが一手間掛かります。折角なので電子的に送付できるようにしてスマートな操作を実現したい。
そこで、公開鍵送付専用のユーザーを作成する事にしました。
調べた結果、sftp なら OpenSSH だけあれば構築できるようです。余計なモジュールのインストールは不要。chroot 設定も可能。操作体系は ftp 準拠なので、変なコマンドを実行されてしまう事もありません。
と言う訳で。その為の設定を実施します。
参考文献
- 鍵とパスワードの認証を混合するsshd_configの設定 - treedown’s Report
- SSHでちょっとした設定TIPS - treedown’s Report
- OpenSSH : SSH ファイル転送 (Ubuntu)
- OpenSSH : SFTP only + Chroot
- Linux にログインできないユーザを作成する - てしりこじり
- SCPとSFTPの違い - OS - クラウド・AWSのIT技術者向けブログ SKYARCH BROADCASTING
- sshdのmatchでユーザ単位・アドレス単位でchrootをさせるなど、matchに応じて処理方法を変える - 201703 - Blog - 俺的備忘録 ~なんかいろいろ~
サーバー設定
root になる
以下の作業の殆どで root 権限が必要になります。
一々sudo
してもいいのですが。
sudo -i
スナップショット
zfs snapshot tank/ROOT/ubuntu@$(date +%Y%m%d_%H%M%S)_before_publickey
ユーザー追加
ユーザー名は publickey とします。異論もおありと思いますが、共通鍵の運搬専用という事で今回はこれにします。
- ユーザー名は publickey
- ホームディレクトリ無し
- ログイン禁止
上記を踏まえて、下記のコマンドを実行します。ユーザー作成とパスワード設定になります。
useradd -s /usr/sbin/nologin -M publickey
passwd publickey
追加したユーザーの sftp 設定
publickey は共通鍵の送付専用です。その送付対象となる共通鍵ファイルは/srv/publickey
ディレクトリに置く事とします。異論もおありでしょうけども、私はこう決めました!
と言う訳で皆様それぞれの思想に従って細かい点は調整をお願いします。
下記のコマンドを実行します。
mkdir /srv/publickey
chgrp publickey /srv/publickey
cat >/etc/ssh/sshd_config.d/publickey.conf <<___
Match User publickey
X11Forwarding no
AllowTcpForwarding no
PermitTTY no
PasswordAuthentication yes
ForceCommand internal-sftp
ChrootDirectory /srv/publickey
___
ssh 設定ファイルを作成したらsshd
を再起動します。
systemctl restart sshd
確認
準備
確認用のファイルとディレクトリを準備します。
どうも接続先ディレクトリは root がオーナーで、root 以外の書き込みが禁止されていないと、接続に失敗するようです。従って書き込み確認用にサブディレクトリを用意しておきます。
cd /srv/publickey
echo hello,world >hello.txt
mkdir publickey
chgrp publickey publickey/
chmod g+w publickey/
こういう場合は権限に注意して確認します。
# ls -l
total 2
-rw-r--r-- 1 root root 12 Feb 25 17:48 hello.txt
drwxrwxr-x 2 root publickey 3 Feb 25 18:03 publickey
接続と転送
別マシンからサーバーへ publickey ユーザーで ssh 接続します。私は Win10 マシンで実行しました。
下記のように、これは失敗します。
>ssh publickey@secondary.home
publickey@secondary.home's password:
PTY allocation request failed on channel 0
This service allows sftp connections only.
Connection to secondary.home closed.
実は scp も失敗します。解説記事は見つからなかったのですが、どうも ssh 接続できないと scp も出来ないようです。
>scp publickey@secondary.home:/hello.txt .
publickey@secondary.home's password:
protocol error: mtime.sec not present
sftp は成功します。
>sftp publickey@secondary.home
publickey@secondary.home's password:
Connected to secondary.home.
sftp> pwd
Remote working directory: /
sftp> ls -l
-rw-r--r-- 1 root root 12 Feb 25 08:48 hello.txt
drwxrwxr-x 2 root 1001 2 Feb 25 09:03 publickey
sftp> get hello.txt
Fetching /hello.txt to hello.txt
/hello.txt 100% 12 0.8KB/s 00:00
sftp> cd publickey
sftp> put hello.txt
Uploading hello.txt to /publickey/hello.txt
hello.txt 100% 12 0.0KB/s 00:00
sftp> ls -l
-rw-rw-r-- 1 1001 1001 12 Feb 25 09:04 hello.txt
sftp> pwd
Remote working directory: /publickey
sftp> exit
仕舞い
動作確認できたら/etc
を Subversion 登録しましょう。
svn st /etc | grep "^?" | cut -b9- | xargs -I{} find {} -type f -or -type d -or -type l | xargs -t svn add
svn ci /etc -m"set publickey user"
これで、サーバーマシンとクライアントマシンの間で公開鍵を送付する手段を確保できました。やったね