CentOS7でのSSH設定(公開鍵認証+SFTP+Chroot)
今、こんなサイトを作っています。
RankBase
これを作るにあたり、今まで使っていたVPSをOSのインストールからやり直しました。
なんでかって?
今更CentOS5+PHP5.4とかの環境で作業したくなかったからです。
ということで、新しい環境はCentOS7+PHP7+MySql5.7です。
でまぁ、この記事ではSSHでの公開鍵認証での設定をメモっておきます。
ぶっちゃけこれはググれば、いっぱい出てくるんですけどSFTPユーザー作って、Chrootもほしかったのでそれも一緒に書いていきます。
勿論、ただのFTPなんてもう使いません、
vsftpdって結構設定面倒だし、わざわざ時間かけて穴作ってどうすんだって話です。
概要
- sshの公開鍵認証を実装
通常のパスワード認証だと、クラッキングで割られたら大問題です。
公開鍵認証でのログインにします。 - sftpのchroot機能を実装
自分一人なら公開鍵認証一つで事足りることが多いですが、
例えば、外部のデザイナーなどにSFTP情報を渡したい際などにchrootの機能があると便利です。
Chrootをしておけば、余計なデータ見られずにすみます。
いちいち、鍵発行するのは面倒ですし説明も楽です。
条件・環境
- CentOS7での実装です。
CentOS7は5,6系とはコマンド関連の違いが大きいので気をつけてください。 - ローカルPCはMacでの想定。
勿論、Windowsでもできるとは思いますが一応。
【ローカル側】前準備
先に認証鍵のペアを作っておく。
既にある場合は飛ばしていいです。
$ cd ~/.ssh/;
$ ssh-keygen -t rsa -b 4096;
ローカルPCでターミナルで鍵証明書の発行
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/you/.ssh/id_rsa): [/Users/you/.ssh/test_id_rsa]
保存する鍵ファイルの名前を聞かれます。デフォルトのままで良ければ、
Enter
。ここでは、[test_id_rsa]にします。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
パスフレーズを聞かれます。必用な場合は入力し、もう一度入力。
ここでは空にします。
The key fingerprint is:
SHA256:q/a//AL6xDsaooOY7+YmFRGMHwX32p9/bdDsC2gyEQ7Q57E you@host
The key's randomart image is:
+---[RSA 4096]----+
| .. oo+o+o |
| ...o+. . |
| .oooo . |
| oE+ o |
| So .. .o |
| ..=o . ..+|
| .==+o . +o|
| oo.+B. . *|
| ..oo**+. o+|
+----[SHA256]-----+
こんな感じで生成が完了します。
$ ls -l
total 216
-rw------- 1 you staff 3243 12 7 17:20 test_id_rsa
-rw-r--r-- 1 you staff 754 12 7 17:20 test_id_rsa.pub
この2つのファイルが生成されています。Macの場合、test_id_rsaは600、test_id_rsa.pubは644のパーミッションになっていないとログイン時にエラー出るので注意です。
【サーバ側】前準備
$ sudo groupadd sftp_only;
サーバにログインし、SFTP用ユーザーのグループを作っておく。ここではsftp_onlyという名前のグループにしています。
$ sudo mkdir /root/bin/;
$ sudo vi /root/bin/chroot-useradd;
SFTP用のユーザーを作成するコマンドを作る。#!/bin/bash
#
# Usage: ./chroot-useradd username [shell]
#
# Sanity check
if [ "$1" = "" ] ; then
echo " Usage: ./chroot-useradd username [shell]"
exit 1
fi
useradd $CHROOT_USERNAME
chown root:root /home/$CHROOT_USERNAME
chmod 755 /home/$CHROOT_USERNAME
usermod -d /home/$CHROOT_USERNAME/ $CHROOT_USERNAME
usermod -G sftp_only $CHROOT_USERNAME
passwd $CHROOT_USERNAME
cd /home/$CHROOT_USERNAME/
exit 0
このコードで保存。このコマンドはユーザー作成=>持ち主・パーミッション調整=>パスワード設定=>グループへの追加を自動でやってくれます。
ルートディレクトリとか変えたい場合は適当に改造してください。
【サーバ側】sshd_configの編集
sshdの設定を変えていきます。
#rootでの直接ログインをオフ、これはもう必須
#PermitRootLogin yes
↓
PermitRootLogin no
#鍵認証でのログインをオンにする
#RSAAuthentication yes
#PubkeyAuthentication yes
↓
RSAAuthentication no
PubkeyAuthentication yes
#通常ではパスワードでのログインはオフにする
PasswordAuthentication yes
↓
PasswordAuthentication no
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
↓
Match Group sftp_only #sftp_onlyグループに属している時のみの以下の設定で上書き
PasswordAuthentication yes
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory %h
ForceCommand internal-sftp
ChrootDirectoryの設定についてはサーバの環境によって、色々変わると思います。
%hはユーザーのルートディレクトリの事を指します。
※この段階ではまだrestartしない方がいいかもです。
【サーバ側】公開認証鍵でログインするユーザーの作成
#公開認証鍵でログインするユーザーの作成
[user@host /home]$ sudo useradd test_user;
[user@host /home]$ sudo su test_user
[test_user@host home]$ cd ~/
drwxr-xr-x 2 test_user test_user 6 11月 4 16:39 public_html
[test_user@host ~]$ ls -la
drwx------ 6 test_user test_user 128 12月 7 20:00 .
drwxr-xr-x. 10 root root 4096 12月 7 19:54 ..
-rw-r--r-- 1 test_user test_user 18 11月 4 16:39 .bash_logout
-rw-r--r-- 1 test_user test_user 193 11月 4 16:39 .bash_profile
-rw-r--r-- 1 test_user test_user 231 11月 4 16:39 .bashrc
drwxrwxr-x 3 test_user test_user 17 12月 7 20:00 .cache
drwxrwxr-x 3 test_user test_user 17 12月 7 20:00 .config
drwxr-xr-x 2 test_user test_user 6 11月 4 16:39 .ssh #ディレクトリが無いなら作る
-rw-r--r-- 1 test_user test_user 658 11月 4 16:39 .zshrc
drwxr-xr-x 2 test_user test_user 6 11月 4 16:39 public_html
#上で作ったtest_id_rsa.pubの記述をコピーしてこのファイルに貼り付けて保存
[test_user@host ~]$ vi .ssh/authorized_keys
[test_user@host ~]$ chmod 600 .ssh/authorized_keys
#パーミッションは600に
[test_user@host ~]$ ls -la .ssh
drwxr-xr-x 2 test_user test_user 28 12月 7 20:09 .
drwx------ 6 test_user test_user 4096 12月 7 20:09 ..
-rw-rw-r-- 1 test_user test_user 754 12月 7 20:09 authorized_keys
#ここでも、持ち主とパーミッションには注意
これで、公開認証鍵でのログインの準備はOK
#元のユーザーに戻る、このユーザーがsudoできるならしなくてもいい。
[test_user@host ~]$ exit
#sshd再起動、CentOS7じゃない場合コマンド違うので注意
[user@host /home]$ sudo systemctl restart sshd.service;
sshd再起動する。
【クライアント側】秘密鍵を指定しログインしてみる
$ ssh -i ~/.ssh/test_id_rsa test_user@[サーバのIP]
Last login: Thu Dec 7 20:14:19 2017
#ログイン成功!!
[test_user@host ~]$
これで、公開認証鍵ログインは完了!
次はSFTPユーザの作成。
【サーバ側】SFTP専用ユーザを作る
[user@host /home]# chroot-useradd test_sftp_user
ユーザー test_sftp_user のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
[user@host /home]#
【クライアント側】SFTP専用ユーザでログインしてみる
#試しにsshでログインしてみる。
$ ssh test_sftp_user@[サーバのIP]
test_sftp_user@xxx.xxx.xxx.xxx's password:
#SFTPじゃないとログインさせないよ、っていう警告
This service allows sftp connections only.
Connection to xxx.xxx.xxx.xxx
#今度はSFTPでやってみる
$ sftp test_sftp_user@[サーバのIP]
test_sftp_user@xxx.xxx.xxx.xxx's password:
Connected to xxx.xxx.xxx.xxx
#SFTPログイン成功!!
sftp> ls -la
drwxr-xr-x 4 0 0 101 Dec 7 11:25 .
drwxr-xr-x 4 0 0 101 Dec 7 11:25 ..
-rw-r--r-- 1 1008 1009 18 Nov 4 07:39 .bash_logout
-rw-r--r-- 1 1008 1009 193 Nov 4 07:39 .bash_profile
-rw-r--r-- 1 1008 1009 231 Nov 4 07:39 .bashrc
drwxr-xr-x 2 1008 1009 6 Nov 4 07:39 .ssh
-rw-r--r-- 1 1008 1009 658 Nov 4 07:39 .zshrc
drwxr-xr-x 2 1008 1009 6 Nov 4 07:39 public_html
sftp> exit
これで、完了!!