重要: YubiKeyの出荷時シークレットは外部サービスに紐づく可能性があるため、組織でシークレットを管理したい場合はHOTPとして初期化してLinOTPに登録してください。
要点と用語定義
- LinOTP: Linuxベースのオープンソース認証サーバー(OTPを複数サポート)。
- YubiKey: YubicoのハードウェアOTPトークン。HOTPモードで組織のHMACキーを書き込める。
- HOTP: RFC準拠のHMACベースのワンタイムパスワード。カウンタ同期方式。
準備(前提条件)
- LinOTPサーバーがインストール済みで、管理者ユーザーとユーザーストアを設定済みであること。
- 管理端末にUSB経由でYubiKeyにアクセスできること(udevルール等で一般ユーザーのアクセスを許可)。
- linotpadminクライアントがインストールされていること。
LinOTPサーバーのインストール概要
LinOTPはPythonベースのWebアプリケーションです。ソースからインストールするか、配布されているdebパッケージを利用します。
- PyPI経由: easy_install / pip でインストール可能。
- Debian/Ubuntu用のdebパッケージあり。リポジトリから簡単に導入できます。
(注)リポジトリの最新パッケージは執筆時点でUbuntu 12.04 LTSでビルドされているとの情報があります。環境に合わせてパッケージ互換性を確認してください。
linotpadminクライアントのインストール
コマンドライン管理クライアントであるlinotpadminclientを使うと、Web UIで行えない操作が可能です。インストール方法の例を示します。
リポジトリを設定している場合:
apt-get install linotpadminclientce
PyPIからインストールする場合:
pip install linotpadminclientce
インストール後、管理クライアントを使って一括登録が行えます。
USBアクセス権限の付与(udevルール)
通常、一般ユーザーはYubiKeyへ書き込むためのアクセス権を持っていません。管理作業用にコンソールユーザーがYubiKeyへアクセスできるようにudevルールを追加します。
例: /etc/udev/rules.d/70-yubikey-enrollment.rules を作成します。
vi /etc/udev/rules.d/70-yubikey-enrollment.rules
内容例(yubikey-personalizationからの抜粋):
# Udev rules for letting the console user access the Yubikey USB
# device node, needed for challenge/response to work correctly.
ACTION=="add|change", SUBSYSTEM=="usb", \
ATTRS{idVendor}=="1050", ATTRS{idProduct}=="0010|0110|0111", \
TEST=="/var/run/ConsoleKit/database", \
RUN+="udev-acl --action=$env{ACTION} --device=$env{DEVNAME}"
ルールを作成したらudevをリロードするか、システムを再起動して反映します。端末でYubiKeyを抜き差しして動作を確認してください。
YubiKeyを一括登録する手順(実践)
以下は実際の典型的なコマンド例です。既存のコードブロックはそのまま保存します。
% linotpadm.py -U https://localhost -a admin -C yubikey_mass_enroll
実行例の出力:
Please enter password for ‘admin’:
Please insert the next yubikey and press enter (x=Exit):
{ u’status’: True, u’value’: True}
Please insert the next yubikey and press enter (x=Exit): x
手順:
- 管理者でlinotpadm.pyを実行します。-U でサーバーURL、-a で管理ユーザー、-C でコマンド名を指定します。
- プロンプトでパスワードを入力します。
- 一つずつYubiKeyを差し込み、Enterを押すとLinOTPにトークンとして登録されます。
- すべて登録し終えたら
x
を入力して終了します。
linotpadm.pyはYubiKeyのシリアル番号を読み取り、シリアル YUBI123456 のように特定可能な形でLinOTPトークンDBに保存します。YubiKey本体の裏面にもシリアルが印字されています。
役割別チェックリスト
- 管理者 (Installer)
- LinOTPサーバーが稼働していることを確認
- linotpadminクライアントがインストール済みであること
- 登録用のアカウントと権限を整備
- udevルールを作成し一般ユーザーのアクセスを確認
- 運用担当 (Operator)
- YubiKeyのシリアル管理台帳を準備
- 登録順序と割り当てユーザーを一覧化
- テストユーザーで認証テストを実施
- エンドユーザー
- 受領したYubiKeyのシリアルを確認
- 初回ログイン手順を理解
標準作業手順(SOP)
- LinOTPサーバーのバックアップを取得する。
- 管理端末でlinotpadminclientを起動。
- udevルールがあることを確認し、YubiKeyを差す。
linotpadm.py -U https://localhost -a admin -C yubikey_mass_enroll
を実行。- 各YubiKeyを差して順次Enter、完了後に x を入力して終了。
- DBに追加されたトークンを管理ポリシーに従ってユーザーへ割り当て。
- 割り当て後、各ユーザーで認証テストを実施。
受け入れ基準(Критерии приёмки)
- すべての予定YubiKeyがLinOTPのトークンDBに登録されていること。
- 各YubiKeyのシリアルが台帳と一致していること。
- 登録済みトークンで実際に認証が成功すること。
- 管理者が個別トークンを無効化・再割当できること。
トラブルシューティング
- YubiKeyが認識されない
- udevルールが正しく配置されているか確認。
- USBポートやケーブルを交換して再試行。
- linotpadmがエラーを返す
- 管理者パスワードやサーバーURLを確認。
- linotpadmのログを確認して具体的なエラー内容を特定。
- シリアルと台帳が一致しない
- 物理ラベルとデータベースのシリアルを再照合。
セキュリティ上の考慮点
- YubiKeyに書き込むHMACシークレットは機密情報です。初期化および配布プロセスは管理者権限のある限定環境で行ってください。
- 生成・配送・保管の各フェーズでトレーサビリティを確保してください。
- 可能であれば登録作業はネットワーク分離された管理ネットワーク上で実施してください。
代替アプローチといつ使うか
- 各デバイスでユーザーが自分で初期化する方法
- 小規模環境やユーザーセルフサービスが可能な場合に有効。
- 専用のYubiKey管理ツールを使う方法
- 大規模導入や複雑なポリシー適用が必要な場合に検討。
- 出荷時シークレットをYubicoオンラインサービスに委ねる方法
- シークレット管理の負荷を下げたいが、外部依存を許容できる場合のみ。
ミニ・メソドロジー(少人数/大規模向け)
- 少人数 (<100個)
- 手動で一括登録。台帳はスプレッドシートで管理。
- 登録後の割当とテストを手作業で行う。
- 大規模 (>100個)
- 登録手順の自動化スクリプトを作成。
- ロールベースのチェックリストと監査ログを用意。
意思決定フロー(簡易)
flowchart TD
A[YubiKey導入の目的] --> B{組織でシークレットを管理するか}
B -- はい --> C[LinOTPでHOTP一括登録]
B -- いいえ --> D[Yubicoサービスを使用]
C --> E{台数は多いか}
E -- はい --> F[自動化・運用プロセス整備]
E -- いいえ --> G[手動で登録]
テストケース(受け入れテスト)
- TC1: 登録直後に管理者がトークンを一覧できる。
- TC2: 登録トークンでユーザー認証が成功する。
- TC3: 管理者がトークンを無効化すると認証失敗となる。
- TC4: シリアルが台帳の値と一致する。
まとめ
LinOTPを使えば、YubiKeyをRFC準拠のHOTPトークンとして組織内で一括登録できます。正しいudev権限設定とlinotpadminクライアントがあれば、複数のYubiKeyを順次投入して簡単に登録可能です。運用ではシークレット管理、台帳の整備、テストの実施を忘れないでください。
重要: YubiKeyの初期化・登録はセキュアな環境で行い、台帳と照合できるようにしてください。
Happy Authenticating!