Amazon Linux 2（EC2）のApacheに複数のSFTP専用ユーザを設けてコンテンツをアップロードできるように交通整理する

# この記事で書きたいこと
* ひとつながりの業務としてアンチョコが欲しかった
    * 同じように欲しいと考えている人のために
    * というか自分向けメモ
* とりわけ権限周りで後からコケて苦労した。一貫して書かれている記事が欲しかった
    * グループの管理にSGID使うといいよ、というTIPSを後から教わってありがたかった

なにせ駆け出しなので途中で間違ったことを書いているかも知れず、優しくご指南賜りたい

# 全体の流れ
## [1]アップロード／メンテナンスされるディレクトリにSGIDを設定する
1. SGIDを再帰的に設定する

## [2]SFTP専用ユーザを作り、apacheグループに入れるまで
1. SUとして新たにユーザを作る
2. そのユーザとして認証セットを作る
3. そのユーザとして「SFTPのみ」に絞る
4. SUとしてそのユーザのログイン時の挙動を定義する
5. SSHDを再起動する
6. 手元のSFTPクライアントで接続チェック
7. そのユーザをグループ「apache」に入れる
8. そのユーザのプライマリグループを「apache」に改める
9. 手元のSFTPクライアントで挙動再チェック

↑これ[2]はユーザ分だけ繰り返す

では詳細。
# [1]アップロード／メンテナンスされるディレクトリにSGIDを設定する
## 1. SGIDを再帰的に設定する
```
/var/www/html
```
隷下を全て「複数のSFTP専用ユーザがUPできるディレクトリ」と定めるのであれば以下の通り。

```
sudo chmod 2755 /var/www/html
```

# [2]SFTP専用ユーザを作り、apacheグループに入れるまで
## 1. SUとして新たにユーザを作る
まず昇格

```
sudo su
```

昇格したらユーザを作成（≒追加）

```
useradd guy-foo
```

このguy-fooにPWを授ける

```
passwd guy-foo

/*聞かれるので↓*/
qmLamoxhi2D0qj9Wth9v2FxcuieSw2yQ
/*と用意しておいたPWをペーストしてやる*/
```

## 2. そのユーザとして認証セットを作る

まずは、そのユーザに、なりすまし

```
sudo su guy-foo
```

以下ちちんぷいぷい（すいません）
↓以下の4行、いっぺんにペーストしてしまって平気

```
cd /home/guy-foo
mkdir .ssh
cd .ssh
ssh-keygen -t rsa
```

この後しばらく難問か質問されるが全てEnterを叩いて進む（パスフレーズなどを省略します、の心）

質問攻めが終わったら仕上げ
↓以下の3行も、いっぺんにペーストしてしまって平気

```
cp /home/guy-foo/.ssh/id_rsa.pub /home/guy-foo/.ssh/authorized_keys
chmod 600 /home/guy-foo/.ssh/authorized_keys
chmod 700 /home/guy-foo/.ssh/
```

## 3. そのユーザとして「SFTPのみ」に絞る
ちょっと手ごわい。Vim登場。

```
vim authorized_keys
```

こう打っただけで画面の様子が一変するので、思わずうろたえる（私の場合）

ファイルの先頭にカーソルがあるはずなので、そのままの状態で以下を（つまり先頭に挿入する具合で）ペースト（Windows 10のubuntuを使っているなら右クリック）。

```
command="internal-sftp" 
```

↑このペースト内容の末尾の「半角スペース」はとても大切（なはず）

ペーストが済んだら、修正内容を「保存」して「閉じる」のだけれど日ごろVimを使わない私にはこれがたいそう恐ろしい。

0. 左下に小さく```--INSERT--```と書かれていることを目視確認する
1. ESCを押下する→記されていた```--INSERT--```が消えたことを確認する
2. そっと```:w```と打ってみる→Vimを普段使わない目は画面の左上に何かが起こることを期待してしまうけれど何も起きない。起きないけれど慌てずに視線を左下へもっていくと、さっき```--INSERT--```とあったあたりに```:w```と書かれているのが分かる。分かったらEnterを押下。
3. 見つめていた跡地に```"authorized_keys"〔中略〕written```と表示されたら書き込み（write）つまり保存完了。
4. そのまま```:q```と打ってEnterを押下すると、ドキドキのVim終了。

###うまくできているかチェック

```
cat authorized_keys
```

catと打ったのにネコが出てこないことに落胆せずに見ていると先ほど編集したファイル「authorized_keys」の中身が画面に記されるので、その冒頭に、挿入した大切な```command="internal-sftp" ```の文字が鎮座していることを確認してチェック完了。

ここで、SFTPユーザ「guy-foo」としてのナリスマシに幕を下ろす。

```
exit
```

すると、ナリスマシ寸前の状態、つまりSUに戻る。

## 4. SUとしてそのユーザのログイン時の挙動を定義する

```
vim /etc/ssh/sshd_config
```

容赦なくまたVim。
末尾まで下って以下の文言を追加するのだけれど、なお末尾まで下るには：
* a）もしINSERTのモードになる前であれば```J```でカーソルは下へ進んでくれる
* b）もしINSERTのモードに変わってしまった後なら```↓```（上下左右キーの下）でカーソルは下へ進んでくれる
INSERTモードに移れずにいる場合、INSERTモードへ切り替えるには```a```を押下
で、末尾に以下4行をペースト。

```
Match user guy-foo
  PasswordAuthentication yes
  ChrootDirectory /var/www/
  ForceCommand internal-sftp
```

ペーストできたら先ほどと同様```:w```（書き込み保存）して```:q```（Vim終了）。
なおこの4行の定義の内容は

* ログインユーザがguy-fooさんの場合は
* PWでの認証を許可してあげて
* ログイン直後のディレクトリは/var/www/に制限して（≒システムのルートではなく）
* 使えるコマンド（機能）は内部SFTPのみ

### うまくできているかチェック
```
cat /etc/ssh/sshd_config
```
書き込んだ4行が末尾にあれば合格
合格していたら以下の一行で特権から離脱

```
exit
```
# 5. SSHDを再起動する
SSHDを再起動してやらないと、いま設定した内容が反映されないので。

```
sudo systemctl restart sshd
```
ここら辺が一言にLinuxと言っても環境によって異なるのでこれも迷った。これはAmazon Linux 2で通用する書式。
## 6. 手元のSFTPクライアントで接続チェック
以下の設定でログインできるか（ログイン先がシステムのルートではなくHTML置き場の下になっているか）チェック


|項目|値|
|---|---|
|接続先ホスト|52.198.44.75|
|ユーザ名|guy-foo|
|パスワード|qmLamoxhi2D0qj9Wth9v2FxcuieSw2yQ|

## 7. そのユーザをグループ「apache」に入れる
まずユーザ ```guy-foo``` がどんなグループに入っているかチェック

```
groups guy-foo
```
↓そこに ```apache``` が含まれていないようなら追加する

```
sudo usermod -aG apache guy-foo
```
↓きちんと追加されたかをチェック

```
sudo cat /etc/passwd | grep guy-foo
```

## 8. そのユーザのプライマリグループを「apache」に改める
このままだと「apacheグループの一員としてファイル／フォルダをアップロードする」ことはできるけれど、クライアントアプリ（WinSCPなど）の通常のアップロード動作では「俺様」として置いてしまい、他のユーザが更新・削除できないファイル／フォルダになってしまう。
ので。

```
sudo usermod -g apache guy-foo
```
↓きちんと```apache```がプライマリドライブになったかをチェック

```
sudo cat /etc/passwd | grep guy-foo
```
## 9. 手元のSFTPクライアントで挙動再チェック
（設定表は先ほどと同一）