能書き
おうちサーバー構築報告:予告からのおうちサーバー構築の続きです。
オレオレ認証局を構築し、それで認証した証明書も作成できるようになりました。今回はその鍵の送付手段です。以前もやりましたが、今回はシェルスクリプトにまとめてみました。
目標
- 公開鍵をsftpで運搬できるようにする
- sftp用のユーザーを用意
- ディレクトリなどを用意し、手順を確立
- ユーザーやディレクトリの用意をシェルスクリプトにまとめる
参考文献
サーバー設定
ユーザーについては下記の条件を満たすように設定します。
- ユーザー名は
transporter
- ホームディレクトリ無し
- ログイン禁止
送付用ディレクトリは下記にします。
- ディレクトリは
/srv/transport/publickey
-
/srv/transport
はroot
の所有とする
サーバー172.16.1.101:ユーザーroot
cd
cat <<"___" >buildTransporter.sh
#!/bin/bash
USERNAME=$1
DIRPATH=$2
PUBLICDIR=$3
useradd -s /usr/sbin/nologin -M $USERNAME
passwd $USERNAME
mkdir -p $DIRPATH/$PUBLICDIR
chgrp $USERNAME $DIRPATH/$PUBLICDIR
chmod g+w $DIRPATH/$PUBLICDIR
cat >/etc/ssh/sshd_config.d/$USERNAME.conf <<___A
Match User $USERNAME
X11Forwarding no
AllowTcpForwarding no
PermitTTY no
PasswordAuthentication yes
ForceCommand internal-sftp
ChrootDirectory $DIRPATH
___A
systemctl restart sshd
___
chmod 755 buildTransporter.sh
サーバー172.16.1.101:ユーザーroot
./buildTransporter.sh transporter /srv/transport publickey
確認
接続と転送
実験用に、公開鍵ではないテキストファイルを置きます。
サーバー172.16.1.101:ユーザーroot
cd /srv/transport
echo hello,world >hello.txt
別マシンからサーバーへtransporterユーザーでssh接続します。私はWin10マシンで実行しました。172.16.1.101が今回のサーバーマシンです。
下記のように、これは失敗します。
クライアントWindows
>ssh transporter@172.16.1.101
The authenticity of host '172.16.1.101 (172.16.1.101)' can't be established.
ED25519 key fingerprint is SHA256:nqgBLKW5g6KIa1wWE1fXVtWeT4P/4pErkSH+iyNRxHc.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.16.1.101' (ED25519) to the list of known hosts.
transporter@172.16.1.101's password:
PTY allocation request failed on channel 0
This service allows sftp connections only.
Connection to 172.16.1.101 closed.
scpは成功しました。前回までは失敗していたんですが…何でしょうね。
クライアントWindows
>scp transporter@172.16.1.101:/hello.txt .
transporter@172.16.1.101's password:
hello.txt 100% 12 0.8KB/s 00:00
sftpも成功しますが、画面表示が前回と微妙に違います。仕様が少し変わったのかな。
クライアントWindows
>sftp transporter@172.16.1.101
transporter@172.16.1.101's password:
Connected to 172.16.1.101.
sftp> pwd
Remote working directory: /
sftp> ls -l
-rw-****** ? root root 12 Dec 29 17:15 hello.txt
drwx****** ? root 1001 2 Dec 29 17:07 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 2.9KB/s 00:00
sftp> ls -l
-rw-****** ? 1001 1001 12 Dec 29 17:21 hello.txt
sftp> pwd
Remote working directory: /publickey
sftp> exit
put
したhello.txt
を確認。
サーバー172.16.1.101:ユーザーroot
cd /srv/transport/publickey/
ls -l
cat hello.txt
hello.txt
が存在する事を確認します。
サーバー172.16.1.101:ユーザーroot
# cd /srv/transport/publickey/
# ls -l
total 1
-rw-rw-r-- 1 transporter transporter 12 Dec 29 08:21 hello.txt
# cat hello.txt
hello,world
動作確認が終了したら、不要なファイルは削除しましょう。
クライアントWindows
del hello.txt
サーバー172.16.1.101:ユーザーroot
cd /srv/transport
rm hello.txt
cd publickey
rm hello.txt
仕舞い
動作確認できたら/etc
をSubversion登録しましょう。
サーバー172.16.1.101:ユーザーroot
svn st /etc | grep "^?" | cut -b9- | sudo xargs -I{} find {} -type f -or -type d -or -type l | sudo xargs -t svn add
svn ci /etc -m"add user 'transporter'"
これで、サーバーマシンとクライアントマシンの間で公開鍵を送付する手段を確保できました。