【技術備忘録⑤】SSHで外部接続された際に、slackへ通知する方法を試用

- 現在利用している言語や技術の記法や不明点等を記録していく記事第五弾。
- 一時期個人的大流行していた「なんでもchatツール通知」の再燃の兆しが、行き来する生活。
- 今回は、久々のslack通知の復習ということで、Linuxのsshログインをslackへ通知するやり方を試用することにしよう。

## 概要
- Linux(例 : Amazon Linux2)へSSHで外部からログインした際に、「ログイン日時・ログイン者情報」等の情報を、slackへ通知するシェルスクリプト。
- **※MACでのSSHログイン通知は、[こちら](https://toripiyo.hatenablog.com/entry/2017/06/03/175300)で確認できたため、参考にする。**

## 結果
- 下記のように、MacからSSHでLinuxサーバーへアクセスした際に、slackへ指定情報付きで、通知。

<img width="604" alt="slack.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/8b8fd13c-b5f1-7f09-a697-2212b7e2cabe.png">

## 環境
- Amazon Linux 2
- Mac OS X 10.13.4
    - SSHでLinuxへ接続するため。

## 手順

### Linuxサーバーの作成

- 1. Macから、EC2で作成したLinuxサーバーへ、下記のコマンドで、ターミナルからSSHで接続する。
    - EC2を利用した簡単なLinuxサーバーの作成は、[こちら](https://qiita.com/0084ken/items/b663f7bd56399c7d0d76)を参考にする。
    - SSH通信については、[こちら](https://webkaru.net/linux/ssh-command/)を参考にする。

```bash
# Linuxへ外部接続
$ ssh -i ~/.ssh/鍵.pem ec2-user@グローバルIP



Last login: Sun Jul 21 08:36:14 2019 from XXXXXXXXXX.jp

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/

```

- 2. ログイン後、下記のコマンドで、Linux内に「.ssh」フォルダと「.ssh/rc」ファイルを作成する。

```bash
# lsコマンドで「.ssh」フォルダがあるか確認する。
[ec2-user@XXXX] $ ls -la

# 「.ssh」フォルダがなければ、作成
$ mkdir ~/.ssh

# 「.ssh」フォルダ内に、通知スクリプトファイルを作成する。
$ touch ~/.ssh/rc
```

### Slack Incoming WebHooksの設定  
- 下記の手順で、slack内の通知したいチャンネルにIncoming WebHooksのアプリを追加。
    - 1. Slack内のアプリを追加したいチャンネルに行き、アプリ名をクリックして、「アプリを追加する」をクリック。
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/697a089b-33ec-5188-b16f-578dce721a9c.png)
    - 2. アプリ追加ページの表示後、「Appディレクトリを表示」をクリック。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/06809bcf-22a6-011b-e958-06f893b565a6.png)
    - 「Appディレクトリ」ページの検索欄に`web`と入力して、出てくる「Incoming WebHook」をクリック。
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/a8904644-1b05-886a-fb16-bcd7427a0210.png)
    - Incoming WebHooksページの「設定を追加」をクリックして、下記の項目を設定後、「インテグレーションの追加」をクリック。
        - 「チャンネルへの投稿」: 通知チャンネル名
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/03e8fd0c-dbaf-8a95-a4a3-32863be7d77d.png)
    - 追加後、設定情報画面が表示されるため、下記の項目を確認・メモしておく。
        - Webhook URL : 外部からのメッセージ投稿機能
        - **※このURLは、スクリプト記述のために利用するため、メモしておく。**
        ![df.png](https://qiita-image-store.s3.amazonaws.com/0/336499/27becf56-b880-c86e-f1dc-18045b056d92.png)
    - 確認後、「設定を保存」をクリック。

### 通知スクリプトの記述
- ターミナルへ戻り、[Linuxサーバーの作成](#linuxサーバーの作成)のステップの際に作成した、Linux上の「~/.ssh/rc」ファイルを下記の内容にする。
    - **※sshで未接続の場合、再度EC2のLinuxへsshでログインする。**
    - **※ファイル編集は、vimを利用しているため、基本操作は[こちら](http://www.gi.ce.t.kyoto-u.ac.jp/user/susaki/command/vi.html)を参考にする。**

```bash:~/.ssh/rc
#!/bin/bash

# Incomming Webhook URLの指定
url="https://hooks.slack.com/XXXXXXXX"

# slack表示内容の定義
now=`TZ=JST-9 date`  # 日本時間形式指定
ip=`who | cut -d'(' -f2 | cut -d')' -f1 | sort | uniq -c | sort -rn`  # ipへ整形
user=`w -hsi | awk '{print $1}'`  # ユーザー名へ整形
readonly USER=`whoami`  # 権限指定 
readonly HOST=`hostname`  # 権限指定

# slack通知形式指定
payload="payload={
  \"attachments\": [
    {
      \"color\": \"#00ff7f\",
      \"title\": \"SSH接続確認\",
      \"fields\": [
        {
          \"title\": \"接続先情報\",
          \"value\": \"${HOST}\",
          \"short\": true
        },
        {
          \"title\": \"日時\",
          \"value\": \"${now}\",
          \"short\": true
        },
        {
          \"title\": \"ユーザー名\",
          \"value\": \"${user}\",
          \"short\": true
        },
        {
          \"title\": \"IP\",
          \"value\": \"${ip}\",
          \"short\": true
        }
      ]
    }
  ]
}"

# データのURL変換後、送信。
curl -m 5 --data-urlencode "${payload}" "${url}" > /dev/null 2>&1
```

- 上記の内容の4行目の、「Incomming Webhook」のURLを[Slack Incoming WebHooksの設定](#slack-incoming-webhooksの設定)のステップの際にメモしたURLへ修正する。
- 修正後、保存して、下記のコマンドで、スクリプトファイルを読み込む。

```bash
$ source ~/.ssh/rc
```

- 上記を実行後、slackへ下記のようなメッセージが通知されることを確認。

<img width="604" alt="slack.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/8b8fd13c-b5f1-7f09-a697-2212b7e2cabe.png">

- ssh接続通知確認のため、一度再接続して、同様にメッセージが通知されることを確認したら完了。

## まとめ
- 今回は、slack通知の復習ということで、久々のslack通知が届いた歓喜の瞬間に、静寂を強制された空間にいたことを後悔しながら、記事を書く。
- 「賢人達の大量のサンプルプログラムに心から感謝」という思いを、「賢人依存の継続」と同時に抱く。
- サーバー接続・管理系ツールへの興味が湧いた私は、次なる賢人情報の調査をすることにしよう。

## 参考
- https://qiita.com/aoya6i/items/a496e4bf158177e263fc  
→こちらの記事を参考にしました。大変お世話になりました。

- https://toripiyo.hatenablog.com/entry/2017/06/03/175300  
→こちらの記事を参考にしました。大変お世話になりました。