Have I been pwned?
突然ですが、「Have I been pwned?」というサイトをご存知ですか?
メールアドレスの漏洩状況をチェックできるサイトです。
メールアドレスのほかにもパスワードの漏洩チェックもできます。
このサイトでは、過去にあった大規模なメールアドレスなどの流出を起こしたウェブサービスのデータが登録されています。
ということは、漏洩があったデータはどこかで取得することができるので、辞書攻撃などの被害にあう可能性が非常に高くなります。
実際にhogehoge@gmail.com
でやってみると、↓
画像下部が流出したWebサービスの一覧です。
だいぶ漏洩してますね。(まぁhogehogeなんでなんともいえないですが...)
ちなみにこのサイト「Have I been pwned?」にはAPIが用意されています。
今回はそのAPIを使ってSlackにいる全社員のメールアドレスをチェックします。
セキュリティとバケツの話
会社でのセキュリティ対策は大変です。どんなにきっちりした対策をしていても、たった1人の社員のアカウントのパスワード設定がゆるかったりするとそこがセキュリティホールとなり、攻撃することできます。
これをバケツと穴の話で例えられたりします。
バケツに社員分の穴を空けます。そして水を注いで、水の水位がその会社のセキュリティ対策レベルということです。
- バケツの穴: 社員1人のセキュリティ対策 (対策をしているほど位置が高い)
- バケツの水位: 会社全体のセキュリティ対策度合い
低いところに穴が空いたバケツにどんなに水を注いでもバケツの水は低いままですよね。
つまり、一部の社員のセキュリティ対策をしっかりしても意味がなく、全社員のセキュリティ対策をしないといけないということです。
本題: 全社員のメールアドレスの漏洩をチェック
ということで、全社員のメールアドレスの漏洩のチェックをしましょう!
まず以下のアドレスにアクセスして、
(hogehoge-companyはよしなに変えてください)
https://hogehoge-company.slack.com/stats#members
列の編集ボタンを押して、メールアドレスを表示するようにしてから、CSVのエクスポート
をしましょう。
これで、(Slackに登録されている)全社員のメールアドレスが取得できました。
あとは以下のスクリプトを実行するだけ!
(落としたCSVファイルをslack_user_list.csv
に名前を変えてスクリプトと同じディレクトリに入れて実行してください。)
import csv
import requests
import time
CSV_PATH = "slack_user_list.csv"
MAIL_COLUMN_INDEX = 2
def get_mail_list_slack_csv(file_path):
mail_list = []
with open(CSV_PATH, 'r', encoding="utf-8") as f:
reader = csv.reader(f)
header = next(reader)
for row in reader:
mail_list.append(row[MAIL_COLUMN_INDEX])
return mail_list
def is_leaked(mail_address):
time.sleep(5)
endpoint = "https://haveibeenpwned.com/api/v2/breachedaccount/%s" % mail_address
res = requests.get(endpoint)
if res.status_code == 429:
time.sleep(5)
return is_leaked(mail_address)
else:
return res.status_code != 404
if __name__ == "__main__":
mail_list = get_mail_list_slack_csv(CSV_PATH)
leaked_mail_list = []
for idx, mail_address in enumerate(mail_list):
leaked = is_leaked(mail_address)
print(idx+1, mail_address, "pwned!" if leaked else "no pwnage found!")
if leaked:
leaked_mail_list.append(mail_address)
time.sleep(5)
print()
for mail_address in leaked_mail_list:
print(mail_address)
最後に
「Have I been pwned?」で漏洩がわかってもそこまで焦ることではないです。(メールアドレスが漏洩しているだけなので)
ただ、漏洩してて単純なパスワードなどだと結構危ないです。
さらに、パスワードの使い回しをしていると漏洩したサイト以外も不正アクセスされます。
- パスワードの使い回しを避ける
- 多要素認証を使う
- 必要であればパスワード管理ソフトを使う
など対策を行いましょう。
ちなみに結構な割合で漏洩してます。
その他
今回使ったスクリプトのレポジトリ↓