Bringing true chatops with slack to your team.
slack will be reborn as a shell prompt.
Let's get devs and SREs together in the same channel, and work with the same authority!
-
v0.2
- パスワード文字列の暗号化
- 平文でパスワードを書いてたのを暗号化文字列にできるようにしました(気休め的な)
- 禁止文字列の実装
- rm -rf /みたいな危険コマンドの実行を弾けるようにしました(ただし、やっつけ実装)
- ファイルのアップロード
- ファイルをslackにアップロードできるようにしました
- 長い出力をファイルにまとめる実装
- 長い出力をだらだらslackに載せずに、テキストファイルにまとめるようにしました
- エラーをちゃんとslackに出す
- v0.1はローカルだけの出力が多かったので修正しました
- 鍵認証に対応
- 鍵認証ファイルを指定した場合に、自動的に鍵認証するようにしました
- パスワード文字列の暗号化
-
v0.3
- Windows対応(クライアント/ボット両方)
- Windowsバイナリに対応と、あわせてコマンド投げ込み先をWindows対応にしました
- ソケットモード対応
- これでngrokとかでインバウント通信を開けなくて良くなりました。
- コンフィグファイルの変更を検知してホットリロード
- コンフィグファイルに変更があった場合に自動的に再読み込みします
- 実行者の名前を出力する
- 実行者が多数いると埋もれてしまうので、命令した人にメンション入れるようにしました
- aliasコマンドをつける
- 長ったらしいコマンドを短縮登録できるようにしました
- ログ出力をつける
- systemdに登録した時にログが残しずらいのでログ出力モードをつけました
- Windows対応(クライアント/ボット両方)
-
v0.4
- 設定をエクスポートして永続化
- アクセス先やディレクトリ、alias定義を変更時にコンフィグに書き出すようにしました
- もっとセキュリティ的につよく
- 禁止コマンドを実行したときに、アラートとしてメンションを飛ばすようにしました
- アップロードに対応
- 直前にslackにあげたファイルをサーバー側にアップロードできるようにしました
- ホスト選択のインタラクティブメッセージ化
- アクセス先の切り替えを分かりやすく、インタラクティブ化しました
- ホスト定義の自動チェックモード追加
- コンフィグ読み込み時にホスト定義がアクセス可能かどうかチェックするようにしました
- 設定をエクスポートして永続化
-
v0.5
- マルチタスクに対応
- 重いタスク実行時に完了かタイムアウトまで次のコマンドが実行できなかったので平行できるようにしました
- リモートサーバーからのファイルアップに対応
- コードを実行したサーバー上からファイルがアップできなかったのでリモートサーバーからバケツリレーするようにしました
- (無くなった機能)REST APIと旧来のBot機能を廃止し、socketmode一本に統一しました
- 開発時も使ってないのでメンテする意味も無いかなって
- マルチタスクに対応
-
v0.6
- 設定をラベル化して各ユーザーに細かいロールを付けれるようにしました
- アラートエスカレーション先のラベル化
- 使用許可するIDに使用不可コマンド、ファイルのダウンロード/アップロードの権限付与
- 使用禁止コマンドのラベル化
- アクセス可能ホストのラベル化
- 設定をラベル化して各ユーザーに細かいロールを付けれるようにしました
-
v0.7
- 定義名をIDじゃなくてユーザー名にしても名前解決できるようにしました
- IDで書いてあるとこれ誰用の定義だっけ?ってなってしまうのでユーザー名で書けるようにしました
- コマンドの先頭に#を付けることでscpしないで実行する高速実行モードをつけました
- scpでコマンド送ってから実行するのを、実行だけやるので倍速になります
- 定義名をIDじゃなくてユーザー名にしても名前解決できるようにしました
-
v0.8
- 許可されたコマンドだけ実行できる制限モードを付けました
- 禁止ワードを弾くと、反対の制限されたコマンドだけ実行できるモードでより細かくロールをつけれます
- 各アカウントに利用期限を設定出来るようにしました
- アカウントに有効期限の概念を入れました。これで未使用アカウントは自動的に無効化されます。
- 利用期限を定期的にレポートするようにしました
- 特定のチャンネルにレポートを送信し、棚卸出来るようにしました
- コンフィグを外から設定出来るようにADMINモードを付けました
- 設定ファイルを書き換えなくても設定変更出来るようにしました
- 許可されたコマンドだけ実行できる制限モードを付けました
-
v0.9
- レポートがID表示で分かり辛かったので、表示名とメールアドレスも載せるようにしました
-
v0.99
- 実行したセッションが切れず残るバグを修正しました
- SSHの実行後にセッション終了処理が入って無かった・・汎ミスです
- フルパス指定で実行していたコマンドを相対的に実行できるようにしました(ファイルのアップロードも併せて対応)
- これまでファイル参照系コマンドはフルパスが基本でしたが、相対パスで実行できるようにしました。toSLACKコマンドもあわせて対応しました
- 実行したセッションが切れず残るバグを修正しました
-
v0.991
- cdする時に最後に / があると変なディレクトリ表示になる
- cd ../..とか複数指定の時にうまくcd出来ないバグをFIX
-
v0.992
- 他のユーザーのアカウント有効期間を参照しちゃうバグをFIX
-
v0.993
- メンション無しでも動作するようしました!
- 毎回のメンションが無くなり、サクっと動かせるようになりました
- ファイルをSlackへアップロードする時のタイムアウト時間を設定出来るようにしました
- 巨大なファイルでもタイムアウトしないように時間を設定出来るようにしました
- メンション無しでも動作するようしました!
-
v0.994
- プロンプトに今入っているホスト名(ホントはラベル名)が出るようにしました
- ボット名前出ててたんですけど、ボットの名前なんか要らない情報ですよね・・w
- 複数ルールがある時の挙動がバグってたので修正しました
- 複数人で使う時に挙動がオカシイので直しました
- プロンプトに今入っているホスト名(ホントはラベル名)が出るようにしました
-
v0.995
- メンションが煩すぎるとかんじる人がいるようなのでお黙りモード(-nomention)を追加しました
- 静かになります ※ただしセキュリティアラートはメンションでますよ
- メンションが煩すぎるとかんじる人がいるようなのでお黙りモード(-nomention)を追加しました
-
v0.996
- 特定コマンド許可モードの挙動にバグがあったのでFIX
-
v.0.997
- セキュリティFIX
-
v1.0
- 標準出力とエラー出力の文字数が多い方を出力として拾うように変更
- diffコマンドとか差分がある場合にエラー出力に吐くコマンドの出力を拾えてなかったのでなおした
- 標準出力とエラー出力の文字数が多い方を出力として拾うように変更
-
v1.01
- ユーザー数とalias数が違っているとオチてしまっていたのでFIXした
-
2023/06/30追記
- Socket Modeに必要な権限 conversations.connect:manage をOAuth & Permissionsに記載するのが漏れていた・・・(すいません!)
「なんか、このログ気になりますね。。/var/xxxでこのエラーコードでgrepしてもらえますか?」
えっちらおっちら ※ログイン→コマンド叩く→必要個所切り出す→slackに貼る
「すみません、エラーコード間違ってました!正しくはxxです」
えっちらおっちら
「切り出した期間が狭いんで、出てくるの全部貼ってもらえますか?」
えっちらおっちら
「度々すみません、さっき再発したので同じのもう一回調べてもらえますか?」
ぴええええええええんってなって上司に相談すると
「開発にログイン権限渡したくなくて、、面倒だけどゴメンね」
~END~
先日作ったslackの操作をシェルプロっぽくするツール。あとショートカットで文字送ったり
と組み合わせると効果絶大です!(たぶん)
git clone https://github.com/yasutakatou/slabot
cd slabot
go build slabot.go
バイナリをダウンロードして即使いたいならこっち
このツールはslack側の実行許可が必要です。以下の設定をしてください
- ツールをBotとして登録します
- goto slack api
- Create New(an) App
- define (Name)
- select (Workspce)
- Create App
- App-Level Tokens
-Generate Token and Scopes
- define (Name)
- Add Scope
- connections:write
- Generate
- 後で使うのでxapp-から始まるトークンを控えてください
- Done
- Socket Mode
- Enable Socket Mode
- On
- Enable Socket Mode
- OAuth & Permissions
- Scopes
- Bot Token Scopes
- app_mentions:read
- channels:history
- chat:write
- files:read
- files:write
- users:read
- conversations.connect:manage
- Install to Workspace
- Bot User OAuth Token
- 後で使うのでxoxb-から始まるトークンを控えてください
- Event Subscriptions
- Enable Events
- On
- Subscribe to bot events
- Add Bot User Event
- app_mentions:read
- channels:history
- v0.993から
- private channelで使用する場合は message.groups を追加してください
- Save Changes
- Enable Events
-
Slackのアプリからボットを使いたいチャンネルで招待してください
- invite bot
- @(ボットの名前)
- invite
- invite bot
-
ターミナルからトークンの設定とツールを実行します
- set environment
- windows
- set SLACK_APP_TOKEN=xapp-...
- set SLACK_BOT_TOKEN=xoxb-...
- linux
- export SLACK_APP_TOKEN=xapp-...
- export SLACK_BOT_TOKEN=xoxb-...
- windows
- ツールを実行します
- set environment
要するに踏み台の機能がBotになったと思っていただければ。全てBotヘメンションしてください
- v0.993より メンション不要になりました。
- ボットが動くローカルでコマンドが実行できるか検証して、エラーにならなければリモートでも実行できるものとして判定します
- つまり動作させたいコマンドはローカルにも入っている必要があります
- SETHOST=[コンフィグの定義名]でアクセス先を指定します
- ユーザーIDが許可されていれば、アクセス先が設定できます
- CLIのコマンドを入れると、ローカルにテンポラリのシェルが書かれます
- scpで転送し、転送先のサーバーでシェルが実行されます
- ながったらしい出力はテキストファイルとしてアップロードされ、畳まれて表示されます。
なお、cdコマンドに対応しているのでcdでディレクトリを移動したら保持されます。
- v0.3より 実行者のお名前をメンションしてくれるようになりました!
- v0.4より RULESでボットを呼ぶとインタラクティブにホストを切り替えられるようになりました!
- v0.7より # を先頭につけることで、バッチをscpしてから実行するモードを直接実行する、-scp=falseにしたのと同じ高速実行モードにします
注) -scp=falseと同じでダブルクォーテーションがあるコマンドは実行できません
- toSLACK=(ファイル名)でサーバー上のファイルをアップできます。 (v0.5からはコードを動かしているサーバーじゃなくて選択しているリモートからアップできるようにしました)
今居るディレクトリパスを参照するのでパス指定せず、cdでディレクトリ移ってからファイル指定してください
v0.5よりコンフィグでユーザー毎にこの機能の使用許可が割り振れます
- toSERVER=(アップ先)でslackに最後にアップしたファイルを接続しているサーバーにアップできます。(v0.4より)
※(アップ先)はフォルダ名を指定します。画像の例のように . を指定した場合はHOMEに配置されます。Windowsはフォルダ指定が難しいので一旦HOMEに置いて移動させた方が良いかも
v0.5よりコンフィグでユーザー毎に機能のこの使用許可が割り振れます
- alias で長ったらしいコマンドの短縮名を付ける事ができます。
alias (短縮名)=(長ったらしいコマンド)で登録できます。aliasのみなら登録されている一覧を出します。
alias (短縮名)= ←空 でaliasを解除できます。
注) aliasは制限コマンドを回避出来てしまうため、制限モードのユーザーには使えません
SLACK経由でコンフィグを書き換えられる特権モードです。
このモードはコンフィグの[ADMINS]に定義された特権アカウントのみ実行が可能です。
使い方としてコンフィグのタブ区切りをカンマに書き換えてボットに投げます。
例1)
例2)
例3)
※平文でパスワード入れてますが、暗号化したものか、鍵認証にした方が良いです
二番目のパラメータにDELETEを指定、三番目に定義済みのラベルを指定すると定義を消せます
例1)
例2)
そうでないアカウントが実行した場合はセキュリティアラートが発行されます。
使うのにコンフィグファイルに動作を定義します。サンプルを参考にカスタマイズしてください。
- [ALERT]
- [REJECT]に定義した禁止コマンドを打った時にメンションで通報します
- SlackのユーザーIDか、here、channnel、everyoneが定義できます
- [REJECT]に定義した禁止コマンドを打った時にメンションで通報します
v0.5よりラベル化が出来ます。以下の場合、[REJECT]でescalation1ラベルを指定した場合に次のタブ区切りで指定したユーザーにメンションされます
[ALERT]
escalation1 U024ZT3BHU5 here
先頭のラベル以降はタブ区切りで複数ユーザーを指定できます。
ただし指定はユーザーのIDで指定してください。この辺りを参考に確認してください
v0.7より) 指定はユーザーIDだけでなく、ユーザー名で指定も出来ます
- [ALLOWID]
- Botの使用を許可するSlackのロールを指定します。
[ALLOWID]
user hostlabel1 RW allow allowrule1 *
SlackのユーザーID、アクセス可能なホストのラベル、ファイルのアップロード・ダウンロードの権限、禁止操作をするルールのラベルを指定します。
ユーザーIDの指定はこの辺りを参考に確認してください。
ホストのラベルは[HOSTS]の定義の先頭と紐づきます。
RWの部分はRWか、Rか、その他が指定できます。RWはtoSLACK、toSERVER両方許可します。RはtoSLACKのみ。その他は両方使えません。
禁止操作をするルールのラベルは[REJECT]の先頭で指定するラベルになります
つぎにallow / rejectで制限モードを指定します。
allowは許可されたコマンドだけ実行できます。リジェクトは逆で禁止されたコマンドは実行できません。
モードの指定の後に、制限モードに指定するルールラベル名を書きます。
allowなら[ALLOW]、rejectなら[REJECT]からラベルを指定します。
続いて使用期限を書きます。YYYY/MM/DD のフォーマットで書いてください。
- は使用期限無期限です
v0.7より) 指定はユーザーIDだけでなく、ユーザー名で指定も出来ます
v0.8より)3つのパラメーターが追加されています。上記でいうところのRWの後の3個です。
- [REJECT]
- 実行を許可しないコマンド等の文字列を列記します。以下のように文字列が入ってたら弾きます。
先頭はルールのラベルです。次はアラートするルールのラベル、その次からは実行を禁止するコマンドです。実行を禁止するコマンドはタブ区切りで複数を指定できます。
[REJECT]
rejectrule1 escalation1 rm passwd vi
メモ: どこに入ってても無条件で弾きます。 `` を使う場合や、ls ; rm -rfみたいにシェルで表現できる事が多いのでうまくバリデーションできないからです
- [HOSTS]
- 接続するホスト情報を定義します。以下のようにタブ区切りで定義します。
- ラベル、定義名,IP/名前解決できるホスト名,SSHのポート番号,ユーザー名,※認証情報,使用するシェルのパス
- hostlabel1 test 127.0.0.1 22 slabot secretpassword /bin/bash
- この定義名をSETHOSTの後に書くことでコマンドの投げ先をスイッチさせます
[ALLOWID]で定義したラベル名と紐づきますのでユーザーごとに指定できるホストが制限できます。
[HOSTS]
hostlabel1 pi1 192.168.0.1 22 pi1 myPassword1 /bin/bash
hostlabel2 pi2 192.168.0.2 22 pi2 myPassword2 /bin/ash
※認証情報 平文のパスワード、暗号化されたパスワード文字列、認証鍵のファイルの3つのどれかを指定します
- v0.3より WindowsのSSH Serverに対応しました!
以下のようにWindowsのOpenSSHにコマンドを投げ込めるようにしました。
使用するシェルのパス(SHEBANG)に以下のようにcmd /Cを指定する事で対応できます。/Cが大文字なので注意!
- v0.4より コンフィグのテストが出来るようになりました!
デバッグモードで以下のようにでます。sshに失敗するようならルールの定義から削除されます
-- HOSTS --
add RULE: windows fzk01 127.0.0.1 *** 22
add RULE: pi1 ady 192.168.0.200 *** 1880
add RULE: pi2 pi 192.168.0.220 *** 2880
※削除されて自動書き出しされた場合は定義が消えるので必要ならコンフィグのバックアップから再追記してください
- v0.4より 設定の永続化ができるようになりました!
コンフィグに以下のセクションが追加されています。こちらの後は各ユーザ事の定義が変更ドリブンで書き出され、永続化されます
[USERS]
※自動書き出し時には、自動でバックアップが出来ます。コンフィグ名に日付が追記されます
- [ALLOW]
- 実行を許可したいコマンド等の文字列を列記します。指定した文字、またはスペース付きの場合に許可します
先頭はルールのラベルです。次はアラートするルールのラベル、その次からは実行を許可するコマンドです。実行を許可するコマンドはタブ区切りで複数を指定できます。
[ALLOW]
allowrule1 escalation1 cd ls cat ps df find
メモ: alias禁止と同様にパイプも使えません
- [ADMINS]
- コンフィグをSLACK経由で書き換えられる特権IDを指定します
ID名を書きます。改行区切りで複数指定できます。
[ADMINS]
admin
- [REPORT]
- 定期的にアカウント使用期限をレポートするチャンネル名を定義します
チャンネル名を書きます。指定できるチャンネルは一つのみです。
[REPORT]
C0256BTKP54
メモ: alias禁止と同様にパイプも使えません
[ALERT]
escalation1 U024ZT3BHU5 here
[ALLOWID]
U024ZT3BHU5 hostlabel1 RW rejectrule1
[REJECT]
rejectrule1 escalation1 rm passwd vi
[HOSTS]
hostlabel1 pi1 192.168.0.1 22 pi1 myPassword1 /bin/bash
hostlabel2 pi2 192.168.0.2 22 pi2 myPassword2 /bin/ash
[USERS]
※v0.4からタブ区切りに変更されています
v0.7から指定はユーザーIDだけでなく、ユーザー名で指定も出来ます
[ALERT]
escalation1 adminuser here
[ALLOWID]
adminuser hostlabel1 RW rejectrule1
[REJECT]
rejectrule1 escalation1 rm passwd vi
[HOSTS]
hostlabel1 pi1 192.168.0.1 22 pi1 myPassword1 /bin/bash
hostlabel2 pi2 192.168.0.2 22 pi2 myPassword2 /bin/ash
[USERS]
U024ZT3BHU5 ~/ 0
ここではv0.7からの変更点を書きます。
[ALLOWID]のファイル操作権限の指定の後に、制限モードの指定、制限ルールの指定、アカウントの期限が追加されました。
[ALLOW]では[REJECT]と同じように許可するコマンドをタブ区切りで設定します。
[ADMINS]には特権コマンドを利用できるアカウントを指定します。
[REPORT]には定期リポートをアップするチャンネルIDを指定します。
[ALERT]
escalation1 adminuser here
[ALLOWID]
user hostlabel1 RW allow allowrule1 *
admin hostlabel1 RW reject rejectrule1 2022/05/24
[REJECT]
rejectrule1 escalation1 rm passwd vi
[HOSTS]
hostlabel1 pi1 192.168.0.1 22 pi1 myPassword1 /bin/bash
hostlabel2 pi2 192.168.0.2 22 pi2 myPassword2 /bin/ash
[USERS]
U024ZT3BHU5 ~/ 0
[ALLOW]
allowrule1 escalation1 cd ls cat ps df find
[ADMINS]
admin
[REPORT]
C0256BTKP54
実行ファイルは以下、起動オプションがあります。
Usage of slabot:
-alert
[-alert=not allow user or command send alert.(true is enable)] (default true)
-auto
[-auto=config auto read/write mode (true is enable)] (default true)
-bot string
[-bot=slack bot name (@ + name)] (default "slabot")
-check
[-check=check rules. if connect fail to not use rule. (true is enable)] (default true)
-config string
[-config=config file)] (default ".slabot")
-debug
[-debug=debug mode (true is enable)]
-decrypt string
[-decrypt=password decrypt key string]
-delUpload
[-delUpload=file delete after upload (true is enable)]
-encrypt string
[-encrypt=password encrypt key string ex) pass:key (JUST ENCRYPT EXIT!)]
-idlookup
[-idlookup=resolve to ID definition (true is enable)] (default true)
-lock string
[-lock=lock file for auto read/write)] (default ".lock")
-log
[-log=logging mode (true is enable)]
-loop int
[-loop=user check loop time (Hour). ] (default 24)
-nomention
[-nomention=This is the mode in which no mentions are made. (true is enable)]
-plainpassword
[-plainpassword=use plain text password (true is enable)]
-retry int
[-retry=retry counts.] (default 10)
-scp
[-scp=need scp mode (true is enable)] (default true)
-timeout int
[-timeout=timeout count (second). ] (default 30)
-toFile int
[-toFile=if output over this value. be file.] (default 20)
-uploadtimeout int
[-uploadtimeout=Timeout time for uploading to Slack (Second). ] (default 900)
コンフィグの[ALERT]セクションの定義でアラートメンションを飛ばすのを有効かするかどうかです。デフォルトはtrueです。
コンフィグの自動読み込み、書き出しを有効かするかどうかです。デフォルトはtrueです。
botの名前です。slackから呼び出すときの名前を指定します。デフォルトはslabotで、slackから @slabot で呼びます。
コンフィグ読み込み時にホスト定義が接続可能かチェックするモードです。デフォルトはtrueです。オフにすると起動が早くなります。
読み込むコンフィグファイルを指定します。デフォルトは実行ファイルのカレントにある .slabot です。
デバッグモードで起動します。指定すると内部動作情報が色々出てきます。
コンフィグに暗号化されたパスワード文字列を使う場合に、複合するためのキーを指定します。
サーバーにtoSERVERでアップロードした後にslack上のファイルを消すかどうかです。デフォルトはfalseです。
コンフィグに暗号化されたパスワード文字列を使う場合に、パスワードと複合するためのキーを指定して暗号文字を生成します。
出力した文字列をコンフィグの認証情報部分に張り付けてください。
$ slabot.exe -encrypt=mypassword:decryptkey
Encrypt: 5NVkTdvu5-g0pQCcy0RpOnxuaLFplSJZ0SIjtQqyVZKMGcFIuiY=
このオプションを指定した場合は、暗号文字生成後に実行終了します。(既に動いているプロセスには影響はない)
ユーザー名で定義しても、IDに名前解決して動作するモードです。v0.6まで) U024ZT3BHU5 → v0.7から) adminuser
コンフィグの自動読み込み、書き出しの時のロックファイル名です。書き出しと読み込みが衝突するのを防ぎます。共有ファイルシステム上でのバッティングを防ぎます。
ログ出力モードです。デバッグログが以下のように年・月・日・時のフォーマットで出力されます。
コンフィグに指定したチャンネルにレポートをあげる時間の間隔です。単位は一時間でデフォルトは24時間です。
ボットからのメンションが出なくなって静かになります
※ただしセキュリティアラートはメンションでます
パスワード平文モードです。trueにすると、コンフィグの認証情報部分の文字列を複合せずに平文のまま認証します。
内部でscp、sshをリトライする回数です。失敗時にリトライします。
scpでシェルを転送しないモードです。コマンドのみ流すので応答スピードが倍になります
が反面、使えるコマンドにダブルクォーテーション(")が使えなくなります
@slabot echo "t e s t" > sample みたいなのが出来なくなるってことっすね。
sshでコマンドを投げた後のタイムアウト値です。デフォルトは30で30秒を越える場合はコマンド実行に失敗することになります。
長い行数の出力をテキストファイルにして、アップロードする際の閾値になります。デフォルトは20で20行を越える場合にファイルに変換されます。
Slackへのアップロード時のタイムアウト時間です。デフォルトでは900秒待ちます
Apache License 2.0