SSH 接続時（ログイン前）のメッセージ表示を任意に変更する（sshd）

## SSH 接続の利用規約表示

> SSH のパスワード入力時（ログイン<font color="darkorange">**前**</font>）に、任意のメッセージを表示させたい。

[「ssh接続 ログイン前 任意 メッセージ 表示」で Qiita 記事をググって](https://www.google.com/search?q=site:qiita.com+ssh%E6%8E%A5%E7%B6%9A+%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E5%89%8D+%E4%BB%BB%E6%84%8F+%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8+%E8%A1%A8%E7%A4%BA)もヒットしなかったり、ログイン成功後に表示される `motd` などの設定ばかりだったので自分のググラビリティとして。

## TL; DR <sub><sup>（今北産業）</sup></sub>

1. `/etc/ssh/sshd_config` の `Banner` に表示したいテキストのファイル・パスを記載します。
2. この設定は、基本的に法務的な目的で利用されます。<sub><sup>（詳しくは TS; DR 参照）</sup></sub>
3. 動作確認済み環境：
    - **macOS** HighSierra（OSX 10.13.6）, OpenSSH_7.8p1, LibreSSL 2.6.2
    - **Raspbian** GNU/Linux 8（Jessie）, OpenSSH_6.7p1, OpenSSL 1.0.1t  3 May 2016
    - **CentOS** Linux 7（Core）, OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

```shell-session:ログイン前にメッセージを表示させる設定
$ cat /etc/ssh/sshd_config
...
#Banner none
Banner /path/to/your/ssh_banner.txt
...
```
```shell-session:バナーの表示内容
$ cat /path/to/your/ssh_banner.txt
----------------------------------------------------------
ALERT! You are entering into a secured area!

Your IP, Login Time, Username has been noted  and has been
sent to the server administrator!
This service is restricted to authorized users only.   All
activities on this system are logged.  Unauthorized access
will be fully investigated and reported to the appropriate
law enforcement agencies.
----------------------------------------------------------
```
```shell-session:SSH接続例
$ ssh -l <ssh user> 192.168.xxx.xxx
----------------------------------------------------------
ALERT! You are entering into a secured area!

Your IP, Login Time, Username has been noted  and has been
sent to the server administrator!
This service is restricted to authorized users only.   All
activities on this system are logged.  Unauthorized access
will be fully investigated and reported to the appropriate
law enforcement agencies.
----------------------------------------------------------
Last login: Sun Mar 31 10:19:19 2019 from XXXX::XXXX:XXXX:XXXX:XXXX%en0
Password:
~$ 
```

## TS; DR <sub><sup><sub><sup>（メッセージ表示のタイミングにこだわるコマケーこと）</sup></sub></sup></sub>

### SSHログイン時のパスワード入力前のメッセージ表示変更

サーバーに SSH で接続する際にメッセージを表示するタイミングは２つあります。

「パスワード入力<font color="darkorange">**前**</font>」と「パスワード入力<font color="darkorange">**後**</font>」、つまり「ログイン前」と「ログイン後」です。

任意のメッセージは、一般的にログイン<font color=darkorange>**後**</font>に表示させる事が多いと思います。その場合は、`banner`（表示させる情報）を `motd` ファイル[^1]に記載します。

しかし、SSH 接続のパスワードを入力しようとしているユーザー、つまりログイン<font color="darkorange">**前**</font>に任意のメッセージを表示させたい場合には **`sshd_config` ファイル内に表示させたいテキスト・ファイルのパスを記載**します。

1. `banner` 情報（表示させたいテキスト）を記載したテキスト・ファイルを作成
2. `/etc/ssh/sshd_config` 内に `Banner` に続けてパスを記載
3. `sshd` サービスを再起動（ `$ systemctl restart sshd` ）

記載行ですが、`sshd_config` に `Banner` の行がコメントアウトされているのでコメントインするか、その直後に作成したテキストファイルへのパスを記載するのが安心だと思います。 

```conf:/etc/ssh/sshd_config
#Banner /etc/issue.ssh
Banner /path/to/your/banner_msg.txt
```

<details><summary>一般的な <code>banner</code> ファイルは <code>/etc/issue</code> です。</summary>

最初、Banner に使うテキストのファイル名は BSD 系のマニュアルにある [/etc/issue.net](https://linuxjm.osdn.jp/html/netkit/man5/issue.net.5.html) が一般的だと勘違いしていました。

@ttdoda さんより「`RFC 4252でも書かれているように、一般的には /etc/issue だと思う`」と[コメント](https://qiita.com/KEINOS/items/e6da8ed42167fa632c84#comment-f9b7d791f39d04a1cbfb)をいただき、「なぬっ？！」と、調べてみました。`issue.net` は `telnet` 時代のファイル名の慣習だったようで、確かにインターネットの制定団体 [IETF](https://ja.wikipedia.org/wiki/Internet_Engineering_Task_Force) の [RFC 4252](https://tools.ietf.org/html/rfc4252) では以下のように書かれていました。<font color=darkorange>**UNIX/Linux では /etc/issue が一般的な慣習**</font>と言えそうです。

> 5.4.  Banner Message
>
> In some jurisdictions, sending a warning message before authentication may be relevant for getting legal protection.
> Many UNIX machines, for example, normally display text from /etc/issue, use TCP wrappers, or similar software to display a banner before issuing a login prompt.
> <sup>（ [5.4 Banner Message](https://tools.ietf.org/html/rfc4252#section-5.4) | Authentication Requests | RFC 4252 "The Secure Shell (SSH) Authentication Protocol" @ IETF より）</sup>
>
> （筆者訳）
> 5.4. バナーメッセージ
>
> 一部の国や地域（司法の管轄区域下）では、認証の前に警告メッセージを送信することは法的保護を得ることに関係している／適切とされる場合があります。
> 例えば、多くの UNIX マシンは、通常 /etc/issue からのテキストを表示したり、TCP ラッパーや同様のソフトウェアを使用してログイン・プロンプトを発行する前にバナーを表示します。

読み取り権限（`chmod 0644`）が設定されていれば、`/etc/issue.ssh` `/etc/ssh/ssh_banner.txt` `/path/to/my/welcome_ssh.txt` `/etc/issue.net` など、自分で適当に作成したファイルやパスでも動くようです。

</details>

また、変更後は `sshd` （ssh デーモン）を再起動しないといけません。OS を再起動するか、`systemctl reload sshd && systemctl restart sshd` などを実行してください。

### 用途と所感

とある案件で SSH 接続時のログイン前のメッセージを設定するように言われました。

基本的に、この設定は「イタズラする人への警告文」や「利用規約」を表示するといった、**技術的には何の対策にもならない設定**です。個人的には、むしろ「押すなよ！押すなよ！」的な呼び水にも見えます。

「（こんな無駄なことをしても）」と思っていたのですが、**英国・米国やメキシコなどでは「対サイバーテロ法」として制定されている**[^2]らしく、特に 行政機関や企業の業務内容によっては明記するように指導されるようです。

調べてみたところ、この SSH 接続前のメッセージ表示は<strong>「トラブル時の法務的な対策」</strong>、または<strong>「国によっては法令で利用する」</strong>事が多いようです。

どうやら、以下のようなケースに対して「法務的なアクションを取るための名目」としているようです。

1. SSH のポート番号を「22」の[ウェルノウンポート番号](https://ja.wikipedia.org/wiki/TCP%E3%82%84UDP%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%B8%80%E8%A6%A7#%E3%82%A6%E3%82%A7%E3%83%AB%E3%83%8E%E3%82%A6%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7_(0%E2%80%931023))から、あえて一般的でない番号に変えたのに、わざわざポートを探してアクセスしようとしている場合
2. 関連業者などによるイレギュラーな SSH 経由の作業によって提供するサービスが損なわれた場合

しかし、このレベルだと民事裁判レベルです。「国によって法令で利用する」理由を調べると、「**公的機関による調査をスムーズに進めるための事前対策**」として明記が必要な国で利用されるようです。

この「公的機関によるうんぬん」は 1990 年からあり[^3]、その延長として EU の [GDPR（EU一般データ保護規則）](https://ja.wikipedia.org/wiki/EU%E4%B8%80%E8%88%AC%E3%83%87%E3%83%BC%E3%82%BF%E4%BF%9D%E8%AD%B7%E8%A6%8F%E5%89%87) そして[クッキー法](https://www.google.com/search?q=EU+%7BCookie%E6%B3%95+e%E3%83%97%E3%83%A9%E3%82%A4%E3%83%90%E3%82%B7%E3%83%BC%E8%A6%8F%E5%88%B6%7D&tbs=qdr:y)があります。

2018 年ごろから、「OK」を押すまで「このサイトはクッキーを利用しています」的なメッセージがサイトの品質向上の名の下に表示されるサイトが増えたと思います。アレです。

これら法案は「個人情報の取り扱いを明確にさせるためのもの」とされています。意図しない個人情報の不正な売買の取り締まり目的です。

しかし、お気づきでしょうか。「OK」ボタンのみでキャンセル出来ないサイトが大半であることを。

これは、それ以上（個人情報保護以上）にテロ行為やロンダリングなど、「国の監視対象」となった場合に、**追跡に必要な許可を国が得るために、法務的な手続きをスムーズに進めるためのもの**というのが本質だと思われます。

いつか、サイトを表示するたびにマニュアル本くらいの同意書が表示されるようになるんでしょうか、それとも EU めんどくせぇと、EU 圏からのアクセスはブロックするような、[金盾](https://ja.wikipedia.org/wiki/%E9%87%91%E7%9B%BE)ならぬ、なんちゃらファイアーウォールといった壁ができるんですかねぇ。某国は[壁を作りたがってる](https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%83%B3%E3%83%97%E3%81%AE%E5%A3%81)し。

`_(:⁍」 )_`

## 参考文献
- [Computer Misuse Act 1990](https://en.wikipedia.org/wiki/Computer_Misuse_Act_1990) @ wikipedia
- [Regulation of Investigatory Powers Act 2000](https://en.wikipedia.org/wiki/Regulation_of_Investigatory_Powers_Act_2000) @ wikipedia 
- [Banner Files](https://wiki.centos.org/TipsAndTricks/BannerFiles) | TipsAndTricks | wiki @ CentOS
- [Protect SSH Logins with SSH & MOTD Banner Messages](https://www.tecmint.com/protect-ssh-logins-with-ssh-motd-banner-messages/) @ Tecmint
- [ssh waring banner](https://rbgeek.wordpress.com/tag/ssh-warning-banner/) @ Lazy Geek -:)
- [SSH接続時にmotdでメッセージを表示・非表示](http://qiita.com/ryosukes/items/5ca24a808ba9c9c272f6) @ Qiita 
- [サーバーログイン時に便利なメッセージを表示する](http://qiita.com/elzup/items/d5d835937ad3eb385d0e) @ Qiita

[^1]: [`motd` のQiita記事検索](https://www.google.com/search?q=site:qiita.com+motd&tbs=qdr:y) @ Google
[^2]: [Regulation of Investigatory Powers Act 2000](https://en.wikipedia.org/wiki/Regulation_of_Investigatory_Powers_Act_2000) @ Wikipedia
[^3]: [Computer Misuse Act 1990](https://en.wikipedia.org/wiki/Computer_Misuse_Act_1990) @ Wikipedia