Chrome版Google AuthenticatorのJSONファイルから二段階認証(多要素認証)用のTOTP(時間ベースワンタイムパスワード)を取得するシェルスクリプト(バッチ処理プログラム) ~Linux(RHEL、CentOS、Fedora、Debian、Ubuntu)、macOSでAWSのMulti-Factor Authentication(MFA)をコマンドラインで発行する方法~
インターネットを経由してブラウザやAPIを用いて容易にIT基盤を操作できるAWS、GCP、Azureなどのパブリッククラウドでは便利である反面、セキュリティに対して十分な注意を払う必要があります。
特にAWSマネジメントコンソールなどブラウザでWEB管理画面にサインインして、リソースを操作できるサービスでは最近のクラッキング技術の高度化を考慮すると、アカウント、パスワードだけの認証要素では十分なセキュリティは確保できないと言えるでしょう。
そこで、AWSなどのパブリッククラウドを利用する際に推奨されているのが、TOTP(時間ベースワンタイムパスワード)を用いた二段階認証(多要素認証)です。
二段階認証(多要素認証)はパブリッククラウド側で発行されたシークレット文字列から時間に基づくワンタイムパスワード、TOTP(時間ベースワンタイムパスワード)を発行することで、より高度なセキュリティを確保します。
AWSにおける二段階認証(多要素認証)の設定方法は下記に掲載されています。
二段階認証(多要素認証)のTOTP(時間ベースワンタイムパスワード)を発行するGUIアプリケーションとしてGoogle AuthenticatorというGoogle Chromeブラウザの拡張機能があります。
今回はこのChrome版Google AuthenticatorからエクスポートしたJSONファイルから二段階認証(多要素認証)用のTOTP(時間ベースワンタイムパスワード)を取得するシェルスクリプト(バッチ処理プログラム)を紹介します。
Chrome版Google AuthenticatorのJSONファイルから二段階認証(多要素認証)用のTOTP(時間ベースワンタイムパスワード)を取得するシェルスクリプト(バッチ処理プログラム) ~Linux(RHEL、CentOS、Fedora、Debian、Ubuntu)、macOSでAWSのMulti-Factor Authentication(MFA)をコマンドラインで発行する方法~
基本方針としてはChromeの拡張機能であるGoogle AuthenticatorからエクスポートしたJSONファイル(または同じ形式でアカウント、シークレット情報を記載しているJSONファイル)を読み込んで、各アカウントに対するシークレットでTOTP(時間ベースワンタイムパスワード)を発行します。
Chrome版Google AuthenticatorのJSONファイルの形式
Chrome版Google Authenticatorの拡張機能は下記リンクから入手することができます。
Chrome版Google Authenticator拡張機能
このChromeの拡張機能であるGoogle AuthenticatorからエクスポートしたJSONファイルの形式は下記の様になっています。
下記の形式で認証情報を作成するのであれば、Chromeの拡張機能であるGoogle Authenticatorからエクスポートしなくても今回のシェルスクリプトは動作します。
{ "ハッシュ値1": { "account":"アカウント名1", "hash":"ハッシュ値1", "index":表示順番号1, "issuer":"", "secret":"シークレット文字列1", "type":"totp" } , "ハッシュ値2": { "account":"アカウント名2", "hash":"ハッシュ値2", "index":表示順番号2, "issuer":"", "secret":"シークレット文字列2", "type":"totp" } , "ハッシュ値3": { "account":"アカウント名3", "hash":"ハッシュ値3", "index":表示順番号3, "issuer":"", "secret":"シークレット文字列3", "type":"totp" } }
oathtool(oath-toolkit)のインストール
今回のスクリプトでは二段階認証(多要素認証)のシークレットからoathtoolを用いてTOTP(時間ベースワンタイムパスワード)を取得するので、使用するLinuxにoathtoolをインストールする必要があります。
RHEL、CentOS、Fedoraなどでは下記のようにepelリポジトリからoathtoolをインストールすることができます。
[magtranetwork@localhost ~]# yum install -y epel-release [magtranetwork@localhost ~]# yum install -y --enablerepo epel oathtool
Debian、Ubuntuなどでは下記のようにoathtoolをインストールすることができます。
[magtranetwork@localhost ~]# apt-get install oathtool
また、macOSでも下記のようにoath-toolkitをインストールすることができます。
[magtranetwork@localhost ~]# brew install oath-toolkit
Chrome版Google AuthenticatorのJSONファイルから二段階認証(多要素認証)用のTOTP(時間ベースワンタイムパスワード)を取得するシェルスクリプト(バッチ処理プログラム)
シェルスクリプト(バッチ処理プログラム)の内容はまず、上記のChrome版Google AuthenticatorのJSONファイルの形式に対して、indexの値でソーティングしたアカウント別の資格情報を配列に格納します。
その配列の資格情報それぞれに対して、シークレットからTOTP(時間ベースワンタイムパスワード)を取得し、アカウント名とともに表示します。
[magtranetwork@localhost ~]# vim google_authenticator.sh
#!/bin/bash #Chrome版Google AuthenticatorからエクスポートしたJSONファイルへのパスを指定 GAUTH_FILE="./GoogleAuthenticator.json" #改行コード指定 LF=$'\\\x0A' #ソーティングした各資格情報を配列に格納 CREDENTIALS=(`cat ${GAUTH_FILE} | sed 's/ //g' | sed 's/\r//g' | tr -d '\n' | sed 's/[{|}]/'"$LF"'/g' | egrep '"account"' | sed 's/ //g' | sed 's/"index":/"index": /g' | sort -k2n | sed 's/ //g'`) #資格情報の個数を表示 echo "**********Google Authenticator Credentials: ${#CREDENTIALS[@]}**********" #資格情報を1件ずつ取り出して処理 for ((i = 0; i < ${#CREDENTIALS[@]}; i++)) { #資格情報からアカウント名を取得 ACCOUNT=`echo ${CREDENTIALS[$i]} | sed 's/,/'"$LF"'/g' | sed 's/:/ /g' | sed 's/"//g' | grep '^account' | awk '{print $2}'` #資格情報からTOTP(時間ベースワンタイムパスワード)の元となるシークレットを取得 SECRET=`echo ${CREDENTIALS[$i]} | sed 's/,/'"$LF"'/g' | sed 's/:/ /g' | sed 's/"//g' | grep '^secret' | awk '{print $2}'` #oathtoolを用いてシークレットからTOTP(時間ベースワンタイムパスワード)を取得 TOTP=`oathtool --totp -b ${SECRET}` #TOTP(時間ベースワンタイムパスワード)、アカウント名を表示 echo "${TOTP} ${ACCOUNT}" }
Chrome版Google AuthenticatorのJSONファイルから二段階認証(多要素認証)用のTOTP(時間ベースワンタイムパスワード)を取得するシェルスクリプト(バッチ処理プログラム)の実行例
今回のシェルスクリプトを実行すると読み込んだJSONファイルの全てのアカウントの件数とそれぞれのTOTP(時間ベースワンタイムパスワード)、アカウント名を表示します。
[magtranetwork@localhost ~]# chmod 755./google_authenticator.sh [magtranetwork@localhost ~]# ./google_authenticator.sh **********Google Authenticator Credentials: 30********** 640025 account1 870717 account2 900102 account3 250182 account4 850233 account5 410292 account6 700372 account7 440894 account8 930638 account9 890231 account10 340770 account11 940152 account12 970703 account13 720084 account14 480770 account15 660618 account16 280948 account17 200296 account18 460920 account19 190495 account20 210524 account21 170609 account22 490389 account23 940820 account24 050514 account25 570940 account26 330171 account27 700520 account28 130196 account29 390883 account30Reference: Tech Blog citing related sources