CentOS7でのSSH設定(公開鍵認証+SFTP+Chroot)

2017年12月21日

今、こんなサイトを作っています。
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

これで、完了!!