読者です 読者をやめる 読者になる 読者になる

Slack + hubot でwindowsのアカウントロックを解除する?

こんにちは、インフラ担当のszkです。

3年ぶりです。激しく沈黙しておりました。。。
久しぶりの登場ですが、ニッチなネタで攻めたいと思います。

アドウェイズSEのコミュニケーションツールがIRCからSlackに移行が進んでおります。
Slackに移行するにあたり、IRCで使用していたbotの中で、windowsアカウントの
ロック解除など行う機能をSlack用に作り直そうと。。。
Slack上からわざわざアカウントロックを解除する需要があるのか?は考えないことにします!当初ムネリンの記事にあった「OutgoingWebHooks」を使おうかと思いましたが、
汎用性を考慮して「hubot」で行きたいと思います。イメージはこんな感じです。

slack_image
環境は以下を想定しています。
  • hubotサーバのOSはCentOS 6.6
  • hubotは2.16.0
  • ADサーバとの接続はrubyを使用(activeldap)
  • hubotサーバとADサーバは社内に設置

hubotサーバの構築はこんな感じです。

そのままではyumでインストール出来ないので、リポジトリを追加します。
hubotに必要なものはnode.js と redisですが、hubot関連モジュールのインストールはnpmで行うため、npmもインストールします。
$yum install nodejs redis npm

npmがインストール後に実際のhubotやcoffeeなどをインストールします。
ただしhubot起動時に足らないモジュールを大量にインストールすることになりますが。。。。
$npm install -g coffee-script hubot yo generator-hubot


次にhubot用のディレクトリを作成し、yoコマンドを使ってhubotを作成します。
Bot adapterは「slack」にして下さい。
$mkdir bot_isys
$cd bot_isys

$yo hubot
? =============================================
We're constantly looking for ways to make yo better!
May we anonymously report usage statistics to improve the tool over time?
=========================================(Y/n)Y
? Owner: (User <user@example.com>) user@example.com
? Bot name: (bot-isys) bot_isys
? Description: (A simple helpful robot for your Company)
? Bot adapter: (campfire) slack

次にSlack側にhubot用のユーザを作成します。
「Integrations」から「Hubot」を選択します。
hubot_view


profileの「API Token」の内容をhubotサーバの環境変数に設定する必要があります。
hubot_profile


API Token」を環境変数に設定し、hubotを起動すると。。。。エラーが出ます。
$export HUBOT_SLACK_TOKEN=<API Token>
$hubot -a slack
[Mon Oct 19 2015 15:36:51 GMT+0900 (JST)] ERROR Cannot load adapter slack - Error: Cannot find module 'hubot-slack'

 「hubot-slack」のモジュールが見つからないとエラーが出ます。足りないモジュールはnpmコマンドで追加します。
$npm install -g hubot-slack
 
この作業を数回繰り返し、エラーが出なくなればhubotサーバの構築は完了です 。なおhubotサーバはSlack(インターネット側)へhttps通信が許可されている必要があります。どうもSlackはEC2みたいですね。

Slackとhubotサーバの連携はcoffeeスクリプトを使用します。今回ADサーバへの接続はrubyスクリプトを使用するため、coffeeスクリプト内からrubyスクリプトに引き渡します。
module.exports = (robot) ->

 robot.hear /bot_isys (.+)/i, (msg) ->
   Channel = msg.message.user.room
   Items = msg.match[1].split(/\s+/)

   Cmd_arg = Items[0]
   Username_arg = Items[1]

   @exec = require('child_process').exec
   command = "ruby-script.rb #{Channel} #{Cmd_arg} #{Username_arg}"
   @exec command, (error, stdout, stderr) ->
     msg.send error if error?
     msg.send stdout if stdout?
     msg.send stderr if stderr?

bot_isys」をトリガーに、発言されたチャンネルを取得し、引数を2つ取得してrubyスクリプトに引き渡します。rubyスクリプトは 長いので機会がありましたらご紹介します。

実際にSlackからコマンドを入力してみます。入力形式は「bot_isys」+「cmd(第一引数」+「ユーザ名(第二引数)」になります。ユーザ名を推測(suggest)するコマンドを入力すると、

bot_isys-sg
 

上手くいってそうですね。次にロック解除(unlock)のコマンドを入力すると

bot_isys-un
 

実際ADサーバ上でロックを解除されているかはお見せしませんが、ロックした時間とロック解除を表示しています。最後にパスワードリセット行うと

bot_isys-re

こちらもADサーバお見せしませんが、空のパスワードを設定し、次回ログオン時にパスワードを変更を要求するようにしております。なおパスワードリセットは誰もが行えるのは危険のため、インフラ担当のチャネルからコマンドが入力された場合のみ実行されます。

Slackはスマホ用のアプリがあるため、スマホからロック解除などが行えます。これなら誰かからの茶な(時間帯)ロック解除依頼にも対応できそうです。

興味のある方はお試し下さい。

では、また。