Chrome版Google AuthenticatorのJSONファイルから二段階認証(多要素認証)用のTOTP(時間ベースワンタイムパスワード)を取得するシェルスクリプト(バッチ処理プログラム) ~Linux(RHEL、CentOS、Fedora、Debian、Ubuntu)、macOSでAWSのMulti-Factor Authentication(MFA)をコマンドラインで発行する方法~

6月 20, 2018AWS,EC2,Programming,Shell Script

インターネットを経由してブラウザやAPIを用いて容易にIT基盤を操作できるAWS、GCP、Azureなどのパブリッククラウドでは便利である反面、セキュリティに対して十分な注意を払う必要があります。

特にAWSマネジメントコンソールなどブラウザでWEB管理画面にサインインして、リソースを操作できるサービスでは最近のクラッキング技術の高度化を考慮すると、アカウント、パスワードだけの認証要素では十分なセキュリティは確保できないと言えるでしょう。

そこで、AWSなどのパブリッククラウドを利用する際に推奨されているのが、TOTP(時間ベースワンタイムパスワード)を用いた二段階認証(多要素認証)です。

二段階認証(多要素認証)はパブリッククラウド側で発行されたシークレット文字列から時間に基づくワンタイムパスワード、TOTP(時間ベースワンタイムパスワード)を発行することで、より高度なセキュリティを確保します。

AWSにおける二段階認証(多要素認証)の設定方法は下記に掲載されています。

AWS での多要素認証 (MFA) の使用

二段階認証(多要素認証)の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 account30
Reference: Tech Blog citing related sources