前書き
SSHは、接続が安全であり、心配なくリモートホストに対して認証できることを確認するための、かなりの数のセキュリティ機能を備えています。 特に、SSHキーは、パスワードまたはパスフレーズをインターネット経由で送信せずに接続するための安全な方法を作成します。
ただし、SSHキーを使用するのが妥当でない場合や、実際には安全でない場合があります。 たとえば、公共のコンピューターまたは友人のためにトラブルシューティングしようとしているコンピューターからSSHを使用しようとしているとしましょう。 公開鍵システムは、接続元のコンピューターが少なくともある程度信頼できると想定しています。 これは必ずしもそうとは限りません。
このシナリオでキーペアを使用している場合、キーがパスワードで保護されている場合でも、少なくとも認証のために、キーは復号化され、ローカルマシンのメモリに格納されます。 これは、ローカルマシンを信頼しないと脆弱であることを意味します。
*ワンタイムパスワード認証*またはOTPWと呼ばれるシステムは、このような状況で機能するように作成されました。 ワンタイムパスワードは、2要素認証やシングルサインオンソリューションなどの他の認証メカニズムに組み込まれたシステムです。
このガイドでは、Ubuntu 14.04 VPSインスタンスでOTPWをセットアップします。 これにより、1回しか使用できない2つのコンポーネントのパスワードでログインできます。
基本コンセプト
OTPWが機能する方法は、PAM認証システムに接続することです。
OTPWでのログインを許可するようにシステムを構成したら、プレフィックスパスワードを指定して、一連のパスワード「チャンク」を生成できます。 次に、これらを印刷して、アクセスできるデバイス(信頼できるデバイスで暗号化するなど)に保存するか、信頼できないコンピューターを使用してアクセスせずにアクセスできる他の形式で保存します。
これで、パスワードの入力を求められたら、参照番号が与えられます。 作成したプレフィックスパスワードを入力し、その後、指定された参照番号に関連付けられたパスワード部分を入力します。
このパスワードは一度だけ機能します。 誰かがコンピューターにキーロギングを行っている場合、またはパスワードの入力を確認できる場合は、ログイン後に有効にならないため問題になりません。
コンポーネントをインストールする
このシステムを構成するには、最初に必要なコンポーネントをインストールする必要があります。
認証は完全にサーバー側で処理され、クライアント側は通常のパスワードプロンプトと変わらないため、サーバーにインストールするパッケージはわずかです。
パッケージキャッシュを更新し、リポジトリからこれらをインストールします。
sudo apt-get update
sudo apt-get install otpw-bin libpam-otpw
ご覧のとおり、メカニズムは2つの部分に分かれています。 最初のコンポーネントは、ワンタイムパスワードの生成と管理に使用されます。 2番目は、これらのパスワードファイルに対して認証するためにPAMで使用されるプラグインです。
OTPWを活用するためのPAMの編集
実際のパスワードで何かを行う前に、PAMのオプションとしてOTPWを追加する必要があります。
既にhttps://www.digitalocean.com/community/articles/how-to-set-up-ssh-keys—2 [信頼するコンピューターでの認証用にSSHキーを設定します。 構成では、SSHキーが使用可能な場合はそれを使用します。そうでない場合、OTPWメカニズムにフォールバックします。
これを行うには、SSHログインに関係するファイルのみを変更します。 これは、ローカルログインまたはDigitalOcean Webコンソールを介したログインに干渉しません。
SSH PAM構成ファイルを開きます。
sudo nano /etc/pam.d/sshd
ファイルの先頭に向かって、 `+ common-auth +`ファイルをインポートするためのディレクティブがあります。 このファイルにより、OTPWシステムを使用せずに通常のパスワード認証が可能になります。これは、SSHセッションには不要です。 コメントアウトしましょう:
#@include common-auth
この下に、OTPWシステムを使用してパスワードリクエストを処理できるようにする行を追加します。
auth required pam_otpw.so
session optional pam_otpw.so
終了したら、ファイルを保存して閉じます。
SSHDを構成する
OTPWを使用するようにSSHデーモンのPAMモジュールが構成されたので、適切な値でデーモン自体を構成できます。
ルート権限でファイルを開き、ファイルをチェックアウトします。
sudo nano /etc/ssh/sshd_config
いくつかの個別の値を探しています。 これらの各パラメーターが以下の値に設定されていることを確認する必要があります。 パラメータが見つからない場合は、追加して設定します。 ただし、デーモンを失敗させる可能性があるため、パラメーターを複数回追加しないでください。
UsePrivilegeSeparation yes
PubkeyAuthentication yes
ChallengeResponseAuthentication yes
PasswordAuthentication no
UsePAM yes
これらのパラメーターを設定したら、変更を有効にするためにSSHデーモンを再起動します。
sudo service ssh restart
OTPWパスワードファイルの作成
システムが公開鍵を持たないSSHユーザーにOTPWを使用するように構成されたので、このシステムが機能するために必要な2つのパスワードファイルを作成できます。
`+〜/ .otpw +`に保存される1つのファイルには、パスワードセグメントのハッシュ値が1行に1つずつ含まれます。 作成する2番目のファイルは、人間が読み取れるワンタイムパスワードセグメントであり、安全なデバイスにコピーするか、印刷するか、安全なポータブルな場所に保管する必要があります。
このリストを生成するために必要なことは、 `+ otpw-gen +`コマンドを呼び出すことだけです。 これは通常、人間が読めるテキストを標準出力に出力しますが、安全に保つためにファイルにパイプすることができます。
cd ~
otpw-gen > nothingtosee.txt
これにより、ランダムシードが生成され、パスワードプレフィックスが要求されます。 通常のパスワードに使用するのと同じ常識的なルールを使用する必要があります。 パスワードを忘れないようにしてください。
その後、パスワードサフィックスのハッシュ値を含む1行につき1つの `+〜/ .otpw +`ファイルが作成されます。
OTPW1
280 3 12 8
253tFMngG2PNYhn
132Kua%SZ+esb6t
237yH7D2FMbQsyW
125rrXfBRwnF+A%
106gJxhJE4jkknj
04135:5:knWIB4:
232/d4kI:n57IcD
244RASe8ka63b8Z
057GmqfFe=pXQqu
. . .
また、ハッシュされていないサフィックスとその参照番号を、「+〜/ nothingtosee.txt +」のファイルにパイプしました。
OTPW list generated 2014-04-03 18:06 on sshd
000 /rGF h5Hq 056 /zi5 %yTJ 112 J7BT HdM= 168 fdBm X%Tn 224 69bi =9mE
001 GoOG jxYQ 057 E=o3 kuEF 113 zwit p27J 169 nHK9 CXRx 225 IihF =o8g
002 Xm=E PuXc 058 Ok27 ZJ++ 114 On=5 pNYH 170 ZRDa mB5e 226 yYsb CAfn
003 deL+ iHs7 059 /WGS :J4M 115 ZZd/ 8zyU 171 acDd dESV 227 ddjg ipcR
004 KhDn NdfS 060 =tEz ACye 116 FkQ9 8kSu 172 iRSR nZWT 228 9hHd veZ9
005 rGFG K5=7 061 MvUW LRxc 117 2YwY axJJ 173 kEV5 T/Vz 229 wx%n Le6P
006 GWi2 fHjf 062 qOR: WN2x 118 FvD4 oNjT 174 99OT 8KPy 230 /I=Y hicP
007 XPom pEYp 063 8Xvm vZGa 119 UNjF :Kys 175 b95i SU3R 231 keLn aDcK
008 fJI% 3Qs2 064 3I7Q I2xc 120 5Tm9 REQK 176 AVg: 4ijE 232 :aIF op6V
009 P/Sn dSxA 065 A+J6 =4zo 121 LAyj 3m2+ 177 TMuN 9rJZ 233 SWvB %+cL
. . .
左の列は参照番号で、その後に8文字のサフィックスが続きます。 接尾辞の最初と最後の4文字の間のスペースは読みやすくするためであり、接尾辞を入力するときにオプションで削除できます。
デフォルトでは、ジェネレーターは標準の用紙に収まるだけの十分な接尾辞を生成します。これは、印刷や出力を運ぶ1つの方法に最適です。
ワンタイムパスワードアクセスを設定するユーザーごとにこの手順を完了する必要があります。
試してみる
SSHキーで設定されていないコンピューターから(一時的にキーを `+〜/ .ssh +`ディレクトリから移動することもできます)新しいワンタイムパスワードシステムをテストできます。
通常どおりにOTPWで設定したユーザーにログインします。
'' '' '
Password 253:
ご覧のとおり、OTPWが必要とするサフィックスが与えられています。
最初に、接頭辞パスワードを入力し、接頭辞パスワードと接尾辞の間にスペースを入れずに、同じ行に接尾辞を直接入力します。 必要に応じて、接尾辞ファイルに表示されるスペースを保持できます。
プレフィックスパスワードが「crazyburr!to」で、サフィックスファイルに次のような列があるとします。
249 N4HY RsbH
250 +vAz fawn
251 O4/R ZrhM
252 c6kP jgUT
254 aYzA :F64
255 3ezp ZpIq
256 ggIi TD2v
この場合、「crazyburr!toI = aA OKSz」または「crazyburr!toI = aAOKSz」と入力できます。
その後、問題なくログインできるはずです。 `+〜/ .otpw +`ファイルをチェックすると、ハッシュ化された行の1つがダッシュに置き換えられていることがわかります。
. . .
091icM5kSPVOdcU
274Uf3q/=kTYcu8
229fHfmIsCj7mjQ
---------------
115EzDO6=jM/sOT
143iWCdteSk3kg7
265S+QTGcg+MAZO
174UgXchxsI2g:G
. . .
これは、サフィックスが使用されており、無効になっていることを意味します。
2人が同時にアカウントにログインしようとすると、OTPWが代わりにプレフィックスパスワードを要求し、その後に_three_サフィックスが続きます。 要求された3つのサフィックスはそれぞれ異なるため、キーロギングを行ってEnterキーを打つためにあなたを倒そうとする人は、それを正常に完了できません。
プロンプトは次のようになります。
Password 161/208/252:
この状況では、 `+〜/ .otpw.lock +`ファイルが作成されます。 ログインに成功すると、それは削除されるはずですが、状況によってはこれが機能しないバグがあります。 この場合、ロックを手動で削除するだけです。
rm ~/.otpw.lock
次回は、1つのパスワードのみを再度求められます。
警告とバグ
上記で、正常にログインした後にロックファイルが自動的に削除されない場合があることを説明しました。 これは、ユーザーがプロンプトを終了する前にCTRL-Cを入力して接続を中止した場合に特によく起こります。
比較的重要なもう1つのバグは、残っている有効なOTPWエントリの数のレポートです。 これは通常、PAM構成のセッション行によって処理されますが、現在は正しく機能していません。
これを回避するために、Wolfgang Kroenerはhttps://bugs.debian.org/cgi-bin/bugreport.cgi?bug=440516 [このDebianメーリングリストスレッド]でこの機能を実装する非常にシンプルなbashスクリプトを作成しました。 これをさまざまな方法で実装できますが、最も簡単なのは、OTPWを実装しているユーザーのために、 `+〜/ .bashrc +`の最後に追加することです。
nano ~/.bashrc
下に向かって、これを貼り付けます:
if [ "$SSH_TTY" -a -f $HOME/.otpw ]; then
PW_LINES=$(wc -l <$HOME/.otpw)
PW_USED=$(grep -- ---- $HOME/.otpw | wc -l)
echo "OTPW $PW_USED/`echo $PW_LINES-2 | bc` used"
fi
また、これをより集中化された場所に追加することもできます。 そうすれば、各ユーザーに `+〜/ .otpw +`ファイルが存在するかどうかに応じて出力されます。
これで、ログインすると、現在の残りのパスワードの統計が表示されます:
OTPW 6/280 used
OTPWでは、使用可能なパスワードの50%未満になったらパスワードリストを再生成することをお勧めします。 これを行うには、生成コマンドを再実行します。
otpw-gen > anotherfile.txt
これにより、以前のパスワードサフィックスが上書きされるため、この手順の後は使用できなくなります。
結論
OTPWをセットアップすると、安全でない場所からサーバーにログインするオプションが提供されます。 通常のパスワードログインのいくつかの欠点はありますが、安全でないコンピューターに転送されることのないキーベースのログインと、多くの欠陥や脆弱性がある通常のパスワードログインの間の中間点を提供します。