能書き
私的サーバー構築日誌:仕切り直しからの自宅サーバー構築、前回の続きです。
前回はオレオレ認証局で証明書を認証しまして、公開鍵(及び秘密鍵)を作成できる環境を作りました。
ここで問題になるのが公開鍵の送付です。
セキュリティを鑑みると、最終的には ssh を公開鍵認証するようにしたいのです。しかしその為には、クライアントマシンで作成した公開鍵をサーバーマシンに送付しなければなりません。
USBメモリで物理的に運搬、でも良いのですが一手間掛かります。折角なので電子的に送付できるようにしてスマートな操作を実現したい。
そこで、公開鍵送付専用のユーザーを作成する事にしました。
調べた結果、sftp なら OpenSSH だけあれば構築できるようです。余計なモジュールのインストールは不要。chroot 設定も可能。操作体系は ftp 準拠なので、変なコマンドを実行されてしまう事もありません。
この問題は以前も取り上げましたが、今回はユーザー名などを変更します(単純に、私の好みによります)
参考文献
- 自宅サーバー構築譚:公開鍵の送付専用ユーザーを作成 - Qiita
- 鍵とパスワードの認証を混合する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 - 俺的備忘録 ~なんかいろいろ~
目標
- 公開鍵をsftpで運搬できるようにします。
- sftp用のユーザーを用意します。
- ディレクトリなどを用意し、手順を確立します。
サーバー設定
スナップショット
スナップショットだいじ。超だいじ。
sudo zfs snapshot tank/root/ubuntu@$(date +%Y%m%d_%H%M%S)_before_transporter
ユーザー追加
- ユーザー名は transporter
- ホームディレクトリ無し
- ログイン禁止
上記を踏まえて、下記のコマンドを実行します。ユーザー作成とパスワード設定になります。
sudo useradd -s /usr/sbin/nologin -M transporter
sudo passwd transporter
追加したユーザーの sftp 設定
transporter は共通鍵の送付専用です。その送付対象となる共通鍵ファイルは/srv/transport
ディレクトリに置く事とします。異論もおありでしょうけども、私はこう決めました!
と言う訳で皆様それぞれの思想に従って細かい点は調整をお願いします。
下記のコマンドを実行します。
sudo mkdir /srv/transport
cat | sudo tee /etc/ssh/sshd_config.d/transporter.conf >/dev/null <<___
Match User transporter
X11Forwarding no
AllowTcpForwarding no
PermitTTY no
PasswordAuthentication yes
ForceCommand internal-sftp
ChrootDirectory /srv/transport
___
ssh 設定ファイルを作成したらsshd
を再起動します。
sudo systemctl restart sshd
ディレクトリ作成
確認用のファイルとディレクトリを準備します。
どうも接続先ディレクトリは root がオーナーで、root 以外の書き込みが禁止されていないと、接続に失敗するようです。従って書き込み確認用にサブディレクトリを用意しておきます。主に公開鍵をやり取りするのでpublickey
というディレクトリ名にします。
cd /srv/transport
sudo mkdir publickey
sudo chgrp transporter publickey/
sudo chmod g+w publickey/
こういう場合は権限に注意して確認します。
$ ls -l
total 1
drwxrwxr-x 2 root transporter 2 Oct 19 20:14 publickey
確認
接続と転送
実験用に、公開鍵ではないテキストファイルを置きます。
cd /srv/transport
echo hello,world | sudo tee hello.txt >/dev/null
別マシンからサーバーへtransporterユーザーでssh接続します。私はWin10マシンで実行しました。primary.homeが私のサーバーマシン名です。
下記のように、これは失敗します。
>ssh transporter@primary.home
transporter@primary.home's password:
PTY allocation request failed on channel 0
This service allows sftp connections only.
Connection to primary.home closed.
実は scp も失敗します。解説記事は見つからなかったのですが、どうも ssh 接続できないと scp も出来ないようです。
>scp transporter@primary.home:/hello.txt .
transporter@primary.home's password:
protocol error: mtime.sec not present
sftp は成功します。
>sftp transporter@primary.home
transporter@primary.home's password:
Connected to primary.home.
sftp> pwd
Remote working directory: /
sftp> ls -l
-rw-r--r-- 1 root root 12 Oct 19 11:22 hello.txt
drwxrwxr-x 2 root 1002 2 Oct 19 11:14 publickey
sftp> get hello.txt
Fetching /hello.txt to hello.txt
/hello.txt 100% 12 0.1KB/s 00:00
sftp> cd publickey
sftp> put hello.txt
Uploading hello.txt to /publickey/hello.txt
hello.txt 100% 12 0.3KB/s 00:00
sftp> ls -l
-rw-rw-r-- 1 1002 1002 12 Oct 19 11:24 hello.txt
sftp> pwd
Remote working directory: /publickey
sftp> exit
put
したhello.txt
を確認。
cd /srv/transport/publickey/
ls -l
hello.txt
が存在する事を確認します。
$ cd /srv/transport/publickey/
$ ls -l
total 1
-rw-rw-r-- 1 transporter transporter 12 Oct 19 20:24 hello.txt
動作確認が終了したら、不要なファイルは削除しましょう。
cd /srv/transport
sudo rm hello.txt
cd publickey
sudo rm hello.txt
仕舞い
動作確認できたら/etc
を Subversion 登録しましょう。
sudo svn st /etc | grep "^?" | cut -b9- | sudo xargs -I{} find {} -type f -or -type d -or -type l | sudo xargs -t svn add
sudo svn ci /etc -m"set 'transporter' user"
これで、サーバーマシンとクライアントマシンの間で公開鍵を送付する手段を確保できました。