接続できるディレクトリを制限して複数のSFTPユーザを作る

#《課題》
## やりたいこと
* SFTPユーザ毎に接続できるディレクトリを制限
* 公開鍵認証
* chrootで必要以上にディレクトリは見せない
* 共有するディレクトリのパーミッションは755、ファイルのパーミッションは644

**sftpグループに所属するユーザ**
/var/www/vhosts/以下はすべてアクセス可能

**sftp-limitグループに所属するユーザ**
指定したディレクトリ以下のみアクセス可能
※ただし/etc/ssh/sshd_configは初期の設定後は変更をしない

## 今回の設定
* ディレクトリ構成とアクセス権

```bash:
/var/www/vhosts/           : 755 root root      ← sftpは以下にアクセス可
`-- example.com            : 755 sftp_user sftp
    `-- html               : 755 sftp_user sftp
        |-- index.html     : 644 sftp_user sftp
        `-- limit          : 755 sftp_user sftp ← sftp-limitは以下にアクセス可
            `-- index.html : 644 sftp_user sftp
```
* /var/www/vhosts/をルートディレクトリに

#《前提条件》
今回はAWSでAmazon Linux環境で構築

```
# cat /etc/system-release
Amazon Linux AMI release 2016.03

# ssh -V
OpenSSH_6.6.1p1, OpenSSL 1.0.1k-fips 8 Jan 2015
```

#《手順》
##▼OpenSSHの初期設定の確認
```
# vi /etc/ssh/sshd_config
```
```bash:/etc/ssh/sshd_config
︙

#Port 22

︙

#PubkeyAuthentication yes

︙

AuthorizedKeysFile .ssh/authorized_keys

︙

PasswordAuthentication no

︙
```

```#Port 22```
ポートは22番

```#PubkeyAuthentication yes```
公開鍵認証の許可

```AuthorizedKeysFile .ssh/authorized_keys```
公開鍵パス（ホームディレクトリ以下のパス）

```PasswordAuthentication no```
パスワード認証は不可

※もともと\#でコメントアウトしているものはデフォルト値

## ▼sftpグループの設定
### グループの作成とOpenSSHの設定
>#### 1. グループの追加
```
# groupadd sftp
```
#### 2. OpenSSHの設定
```
# vi /etc/ssh/sshd_config
```
```bash:/etc/ssh/sshd_config
︙
>
Match group sftp
       ChrootDirectory /var/www/vhosts
       ForceCommand internal-sftp
```
>
```Match group sftp```
sftpグループに所属するユーザのみ有効の設定
```ChrootDirectory /var/www/vhosts```
接続したときに"/var/www/vhosts"をルートディレクトリにする
（/var/www/vhostsより上はアクセスできない）
※指定するディレクトリは所有者root:root、パーミッション755にする
```ForceCommand internal-sftp```
sftpコマンドのみに制限
>
#### 3. OpenSSHの設定更新
```
# sshd -t
# service sshd reload
Reloading sshd:                                            [  OK  ]
```
```# sshd -t````
構文チェック。何も表示されなければOK

### ユーザの追加
> #### 1. ユーザ追加
```
# useradd -g sftp sftp_user
```
今回は共有するファイル、ディレクトリの所有者はsftp_userとする
>
```-g グループ名```
プライマリグループを指定
>
#### 2. 公開鍵の登録
##### (1) 作成したユーザに切り替え
```
# su - sftp_user
```
##### (2) .sshディレクトリの作成
```
$ cd ~
$ mkdir -m 700 .ssh
```
##### (3) authorized_keysに公開鍵を登録
```
$ vi .ssh/authorized_keys
```
```bash:.ssh/authorized_keys
公開鍵の内容
```
```
$ chmod 600 .ssh/authorized_keys
```
>
※キーペアはssh-keygenコマンドなどで作成

>
##### (4) 元のユーザに戻る
```
$ exit
```

>
##### ※ディレクトリ、ファイルの所有者、パーミッションについて
>```bash:ChrootDirectory
/var/www/vhosts             : 755 root root
```
```bash:鍵認証
/home/
`-- sftp_user               : 700 sftp_user sftp
    `-- .ssh                : 700 sftp_user sftp
        `-- authorized_keys : 600 sftp_user sftp
```


### 接続の確認
>#### ・別の端末からsftpコマンドで接続
>
```
$ sftp -i 秘密鍵 ユーザ名@ホスト名
sftp>
```
>※秘密鍵のパーミッションは600
#### ・リモートのディレクトリとファイルを確認
>
```
sftp> pwd
Remote working directory: /
sftp> ls
example.com
```
/var/www/vhostsと同じものが表示されている
>
```
sftp> cd /example.com/html/
sftp> ls
index.html   limit
```
/example.com/html/のindex.htmlは見えている
>
```
sftp> cd /example.com/html/limit/
sftp> ls
index.html
```
/example.com/html/limit/のindex.htmlは見えている
>
#### ・sftpコマンドの終了
```
sftp> quit
```
---
>#### ・別の端末からsshコマンドで接続
>
```
# ssh -i 秘密鍵 ユーザ名@ホスト名
Could not chdir to home directory /home/sftp_user: No such file or directory
This service allows sftp connections only.
Connection to xxx.xxx.xxx.xxx closed.
```
接続できない

## ▼sftp-limitグループの設定
### グループの作成とOpenSSHの設定
>#### 1. グループの追加
```
# groupadd sftp-limit
```
#### 2. OpenSSHの設定
```
# vi /etc/ssh/sshd_config
```
```bash:/etc/ssh/sshd_config
︙
>
Match group sftp-limit
       ChrootDirectory %h/www/vhosts
       ForceCommand internal-sftp
>
Match group sftp
       ChrootDirectory /var/www/vhosts
       ForceCommand internal-sftp
```
※sftpグループの設定より上に書く

>
```Match group sftp-limit```
sftp-limitグループに所属するユーザのみ有効の設定
```ChrootDirectory %h/www/vhosts```
接続したときに"ホームディレクトリ/www/vhosts"をルートディレクトリにする
※指定するディレクトリは所有者root:root、パーミッション755にする
```ForceCommand internal-sftp```
sftpコマンドのみに制限
>
#### 3. OpenSSHの設定更新
```
# sshd -t
# service sshd reload
Reloading sshd:                                            [  OK  ]
```
```# sshd -t````
構文チェック。何も表示されなければOK

### ユーザの追加
> #### 1. sftp_userユーザの情報を確認
```
# id sftp_user
uid=501(sftp_user) gid=501(sftp) groups=501(sftp)
```

> #### 2. ユーザ追加
```
# useradd -o -u 501 -g sftp -G sftp-limit sftp_user_limit
```
>sftp_userと同じuidをもったユーザとして作成することで、共有されたディレクトリ、ファイルにグループので書き込み権限を与えなくてもいいようにする
``` -o ```
他ユーザと同一uidを持ったユーザの作成
```-u 501```
uidの指定（sftp_userと同じもの）
```-g グループ名```
プライマリグループを指定
```-G グループ名```
セカンダリグループを指定



>
#### 3. 公開鍵の登録
##### (1) 作成したユーザに切り替え
```
# su - sftp_user_limit
```
##### (2) .sshディレクトリの作成
```
$ cd ~
$ mkdir -m 700 .ssh
```
##### (3) authorized_keysに公開鍵を登録
```
$ vi .ssh/authorized_keys
```
```bash:.ssh/authorized_keys
公開鍵の内容
```
```
$ chmod 600 .ssh/authorized_keys
```
>
※キーペアはssh-keygenコマンドなどで作成

>
##### (4) 元のユーザに戻る
```
$ exit
```

>
#### 4. 共有ディレクトリの設定
##### (1) ディレクトリを作成
```
# cd /home/sftp_user_limit
# mkdir -p www/vhosts/example.com/html/limit
```

>
##### (2) 共有するディレクトリをマウント
* 一時的なマウント
>
```
# mount --bind /var/www/vhosts/example.com/html/limit/ /home/sftp_user_limit/www/vhosts/example.com/html/limit/
```

>* 恒久的なマウント
>
```
# vi /etc/fstab
```
```bash:/etc/fstab
︙
/var/www/vhosts/example.com/html/limit/ /home/sftp_user_limit/www/vhosts/example.com/html/limit/ none bind 0 0
```

>
##### (3) 所有者とパーミッションの調整
```
# chown root:root /home/sftp_user_limit
# chmod 701 /home/sftp_user_limit
```
※ChrootDirectoryは指定したディレクトリまでの所有者が全部rootの必要があるのでので、ホームディレクトリをrootに変更する。ホームディレクトリをrootに変更すると次は鍵認証ができなくなるので、パーミションを701に変更ことで鍵認証を可能にする。

>
##### ※ディレクトリ、ファイルのパーミッションについて
>```鍵認証、bash:ChrootDirectory
/home/
`-- sftp_user_limit         : 701 root root
    |-- .ssh                : 700 sftp_user sftp
    |   `-- authorized_keys : 600 sftp_user sftp
    `-- www                 : 705 root root
        `-- vhosts          : 705 root root
```


### 接続の確認
>#### ・別の端末からsftpコマンドで接続
>
```
$ sftp -i 秘密鍵 ユーザ名@ホスト名
sftp>
```
>※秘密鍵のパーミッションは600
#### ・リモートのディレクトリとファイルを確認
>
```
sftp> pwd
Remote working directory: /
sftp> ls
example.com
```
/var/www/vhostsと同じものが表示されている
>
```
sftp> cd /example.com/html/
sftp> ls
limit
```
/example.com/html/のindex.htmlは見えない
>
```
sftp> cd /example.com/html/limit/
sftp> ls
index.html
```
/example.com/html/limit/のindex.htmlは見えている
>
#### ・sftpコマンドの終了
```
sftp> quit
```
---
>#### ・別の端末からsshコマンドで接続
>
```
# ssh -i 秘密鍵 ユーザ名@ホスト名
Could not chdir to home directory /home/sftp_user_limit: No such file or directory
This service allows sftp connections only.
Connection to xxx.xxx.xxx.xxx closed.
```
接続できない