Linuxユーザ切り替え時にSlackに通知する

こんにちは!奥村です!

2018年もアドウェイズエンジニアブログをよろしくお願いします。

Linuxのsuコマンドで特定のユーザに切り替わった際に、Slackへ通知するようにする設定をしてみたので
そちらの設定の記事となります。

手順

  • slackでIncoming WebHooksの設定をする
  • bashrcに何行かのコマンドを書く

これだけです

設定

SlackでIncoming WebHooksの設定をする

webブラウザのSlackにログインした状態で、

https://slack.com/services/new/incoming-webhook

こちらのURLにアクセスします。

f:id:AdwaysEngineerBlog:20180112032126p:plain

通知を飛ばすチャンネルを選択し、「add Incoming WebHooks integration」を押すと
incoming WebHooksのURLが発行されますので、それをどこかにメモっておいてください。

f:id:AdwaysEngineerBlog:20180112032651p:plain

設定すると、Slackのチャンネルのほうにも
「added an integration to this channel: incoming-webhook」と表示されているはずです。

詳細な使い方は

api.slack.com

こちらを参考にしてください。

bashrcに何行かのコマンドを書く

SSH等したときに読み込まれる

  • .bash_profile
  • .bashrc

がありますが 、
.bashrcはシェル起動時に読み込まれるもので、
.bash_profileは初回ログイン時に読み込まれるものだそうです。
(参考にさせていただきました。.bash_profile と .bashrc は何が違うの?使い分けを覚える - Corredor

ユーザの切り替え時に読み込まれるのは.bashrc なのでこちらに記述することにしました。 (「bashrc(Bash Run Command)とbash_profile(Bash Profile)」という違いもあります)

bashrc

bashrcに以下のコマンド群を追記すれば完成です。

# Swith user notification
TTY=`ps Tu | head -n 2 | tail -n 1 | awk '{print $7}'`
USER=`who | grep $TTY | awk '{ print $1 }'`
echo -n "Why do you need root?: "
read REASON < /dev/tty
DATA="{'channel': '#okumura-test', 'username': 'su-Notification', 'text': 'ROOT logged in\n user: $USER\n why: $REASON', 'icon_emoji': ':cop:'}"
curl -X POST https://hooks.slack.com/ここは事前に退避したincomming WebHookのURL -d "$DATA"
unset TTY USER DATA
  • TTY
    • どの端末かがセットされます。
  • USER
    • 指定されたTTYを誰が使っているのかがセットされます。
  • DATA
    • curlでポストする際に使う、JSON形式のテキストです。
  • read REASON < dev/tty
    • 端末への標準入力を変数REASONにセットします。

そして最後にWebHookのURLにPOSTしています。

さっそく試してみます。

試してみる

[vagrant@okumura-machine ~]$ su
パスワード:
Why do you need root?: 連続してメンテナンスをする
ok[root@okumura-machine vagrant]# 

パスワードとログインする理由を尋ねられ、質問に回答すると「OK」と返ってきます。 すると、

f:id:AdwaysEngineerBlog:20180112032753p:plain

のように警察アイコンのbotがユーザーと理由を通知してくれます。

これで、Linuxユーザ切り替え時にSlackに通知する設定は終わりです。

おまけとして
簡単に設定を反映できるように、ansibleも書きました。

- name: add su-Notification to bashrc
  blockinfile:
    dest: ~/.bashrc
    insertafter: EOF
    content: |
      # Swith user notification
      TTY=`ps Tu | head -n 2 | tail -n 1 | awk '{print $7}'`
      USER=`who | grep $TTY | awk '{ print $1 }'`
      echo -n "Why do you need root?: "
      read REASON < /dev/tty
      DATA="{'channel': '#okumura-test', 'username': 'su-Notification', 'text': 'ROOT logged in\n user: $USER\n  why: $REASON', 'icon_emoji': ':cop:'}"
      curl -X POST https://hooks.slack.com/services/(web hook url) -d "$DATA"
      unset TTY USER DATA

blockinfileモジュールで.bashrc に追記しているだけです。

まとめ

incomming WebHookを使うと、curlでslackへメッセージを送れることを知りました。
これで、手軽にシェルからslackへデータを送ることができますね。
シェル修行中の身ですが、これでまた世界が広がったような感じがします。

最近話題の「Meltdown」「Spectre」によってパスワードが抜き取られる可能性がでてきました。
だから、書いたというわけではありませんが、意図しないrootログインや無駄なログインはしっかりと管理したいものですね。

最後までご覧いただきありがとうございました。