こんにちは!奥村です!
2018年もアドウェイズエンジニアブログをよろしくお願いします。
Linuxのsuコマンドで特定のユーザに切り替わった際に、Slackへ通知するようにする設定をしてみたので
そちらの設定の記事となります。
手順
- slackでIncoming WebHooksの設定をする
- bashrcに何行かのコマンドを書く
これだけです
設定
SlackでIncoming WebHooksの設定をする
webブラウザのSlackにログインした状態で、
https://slack.com/services/new/incoming-webhook
こちらのURLにアクセスします。
通知を飛ばすチャンネルを選択し、「add Incoming WebHooks integration」を押すと
incoming WebHooksのURLが発行されますので、それをどこかにメモっておいてください。
設定すると、Slackのチャンネルのほうにも
「added an integration to this channel: incoming-webhook」と表示されているはずです。
詳細な使い方は
こちらを参考にしてください。
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」と返ってきます。 すると、
のように警察アイコンの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ログインや無駄なログインはしっかりと管理したいものですね。
最後までご覧いただきありがとうございました。