Ubuntu Weekly Recipe

第508回 Ubuntuでコマンドラインからワンタイムパスワードを扱う

この記事を読むのに必要な時間:およそ 4 分

ワンタイムパスワードとは?

様々なWebサービスを利用するのが当たり前となった現在,パスワードの管理は頭を悩ます問題だと思います。本連載でも,第412回ではWebベースのパスワードストアアプリとしてRatticWebを紹介しました。

そもそも固定パスワードには,試行に十分な時間をかけることが可能であればいつかは突破できてしまうという,本質的な問題があります。そこで有効期限が極端に短い,一度きりのパスワードを使い捨てにする方法が考えられました。こういったパスワードをワンタイムパスワードと呼びます。

昨今のWebサービスでは通常のIDとパスワードにくわえ,追加でワンタイムパスワードを入力して認証する「二要素認証」の利用が一般的になってきています。ワンタイムパスワードには様々な方式がありますが,一般的なのはTime-Based One-Time Password Algorithm(TOTP)を利用したものでしょう。代表的なアプリにGoogle Authenticatorがあり,Googleはもちろん,AmazonやFacebookなどのWebサービスの認証に利用できるため,このアプリを活用している人も多いのではないでしょうか※1)⁠

※1
Google AuthenticatorではTOTP以外にHOTP(HMAC-based One-time Password Algorithm)も利用可能ですが,あまり使われていないのではないでしょうか(個人の感想です)⁠本記事ではHOTPについての解説は省略します。

とはいえ,Webサービスにログインする度にスマホを取り出し,表示される数字を手で打ち込むのは面倒ですよね。そこでCLIからワンタイムパスワードを扱えるツールを紹介します。

oathtoolでワンタイムパスワードを生成する

TOTPの仕組みを簡単に説明すると,サーバーとクライアントでシークレットをあらかじめ共有しておき,現在の時刻をベースに双方でハッシュを生成して照合しています。シークレットはQRコードかbase32の文字列で提供されます。二要素認証を有効にしたことがある人は,スマホにQRコードを読み込ませたことを覚えているのではないでしょうか。

図1 QRコードとテキストでシークレットが提供されているFacebookの二要素認証の設定画面。通常はGoogle AuthenticatorのカメラでQRコードを読み込むが,手動でシークレットを打ち込むこともできる。今回はコマンドに入力する都合上,シークレットの文字列を控えておく。

画像

「oathtool」コマンドを使うと,base32文字列からワンタイムパスワードを生成できます。まずはoathtoolパッケージをインストールしてください。

oathtoolパッケージのインストール

$ sudo apt install oathtool

以下のようにoathtoolコマンドの引数にシークレットを与えて実行すると,6桁のワンタイムパスワードが標準出力に表示されます。

Google Authenticator同様の6桁のワンタイムパスワードを生成する例

$ oathtool --totp -d 6 --time-step-size=30s --base32 (base32のシークレット文字列)

「--totp」オプションは,Time-Based One-Time Password Algorithmを利用するオプションです。oathtoolのデフォルトはHMAC-based One-time Password Algorithmのため,TOTPを使う場合はこのオプションが必要です。

「-d 6」は6桁のワンタイムパスワードを生成するという意味です。6,7,8桁のみがサポートされています。なお6がデフォルト値のため,普段は省略して構いません。

「--time-step-size=30s」はTOTPの有効期間を30秒にするという意味です。デフォルトが30秒になっているためこちらも省略して構いません。なぜ30秒なのかといえば,RFC 6238で「We RECOMMEND a default time-step size of 30 seconds. This default value of 30 seconds is selected as a balance between security and usability.」とされているためです。実際Google Authenticatorでも30秒ごとに新しいパスワードに切り替わるようになっています。

端末からいちいちパスワードをコピーするのは面倒ですので,以下のようにxclipをパイプで繋いで,クリップボードにパスワードを直接流し込んでしまうのがよいでしょう。あとはWebサービスのログイン画面にペーストするだけです。

生成したワンタイムパスワードをクリップボードにコピーする

$ oathtool --totp --base32 (base32のシークレット文字列) | xclip -sel c

「次」のパスワードを表示するには

ワンタイムパスワードは30秒ごとに切り替わるため,キーボードから入力しているうちにパスワードの有効期限が切れてしまったり,Google Authenticatorのカウントダウンを見ながら新しいパスワードが生成されるのを待ったりした経験は誰にでもあると思います。このような時,今のパスワードの有効期限が切れた後,次に生成されるパスワードが事前に見られたら便利ですよね。

oathtoolでは「-w」オプションを指定することで,ステップごとに生成されるパスワードを複数同時に生成できます。たとえば「-w 3」を指定すると,現在時刻をベースにしたパスワードの他に,30秒後,60秒後,90秒後に生成される3つのパスワードを同時に表示します。

複数個のワンタイムパスワードを連続して生成する例

$ oathtool --totp -w 3 --base32 (base32のシークレット文字列)
123456
789123
112233
445566

著者プロフィール

水野源(みずのはじめ)

Ubuntu Japanese Teamメンバー。理想のフリーデスクトップ環境を求めて東へ西へ……のはずが,気がついたら北の大地で就職していたインフラ寄りのエンジニア。株式会社インフィニットループ所属。

コメント

コメントの記入