序章

SSHは、接続が安全であり、心配することなくリモートホストに対して認証できることを確認するために、かなりの数のセキュリティ機能を備えています。 特に、SSHキーは、インターネット経由でパスワードやパスフレーズを送信せずに接続するための安全な方法を作成します。

ただし、SSHキーの使用が合理的でない場合や、実際には安全でない場合があります。 公共のコンピューターまたは友人のためにトラブルシューティングしようとしているコンピューターからSSHを使用しようとしているとしましょう。 公開鍵システムは、からに接続しているコンピューターが少なくともある程度信頼できることを前提としています。 これは常に当てはまるわけではありません。

このシナリオでキーペアを使用している場合、キーがパスワードで保護されている場合でも、少なくとも認証のために、キーは復号化され、ローカルマシンのメモリに配置されて使用されます。 これは、ローカルマシンを信頼しない場合は脆弱であることを意味します。

このような状況で機能するために、ワンタイムパスワード認証またはOTPWと呼ばれるシステムが作成されました。 ワンタイムパスワードは、2要素認証やシングルサインオンソリューションなどの他の承認メカニズムに組み込まれているシステムです。

このガイドでは、Ubuntu14.04VPSインスタンスでOTPWをセットアップします。 これにより、1回だけ使用できる2つのコンポーネントのパスワードでログインできるようになります。

基本コンセプト

OTPWが機能する方法は、PAM認証システムに接続することです。

OTPWでのログインを許可するようにシステムを構成した後、プレフィックスパスワードを指定することにより、一連のパスワード「チャンク」を生成できます。 次に、これらを印刷して、アクセスできる信頼できるデバイス(携帯電話で暗号化されているなど)に保存するか、なしでにアクセスできる他の形式で次のコンピューターを使用して保存できます。あなたは信用していません。

これで、パスワードの入力を求められたときに、参照番号が与えられます。 作成したプレフィックスパスワードを入力し、その後に指定された参照番号に関連付けられたパスワード部分を入力します。

このパスワードは1回だけ機能します。 誰かがあなたのコンピュータにキーロガーをしている、またはあなたがパスワードを入力しているのを見ることができる場合、あなたがログインした後は有効ではないので、それは問題ではありません。

コンポーネントをインストールします

このシステムを構成するには、最初に必要なコンポーネントをインストールする必要があります。

認証は完全にサーバー側で処理され、クライアント側は通常のパスワードプロンプトと同じであるため、サーバーにインストールするパッケージはごくわずかです。

パッケージキャッシュを更新し、リポジトリからこれらをインストールします。

sudo apt-get update
sudo apt-get install otpw-bin libpam-otpw

ご覧のとおり、メカニズムは2つの部分に分かれています。 最初のコンポーネントは、ワンタイムパスワードを生成および管理するために使用されます。 2つ目は、これらのパスワードファイルに対して認証するためにPAMで使用されるプラグインです。

OTPWを利用するためのPAMの編集

実際のパスワードで何かを行う前に、PAMのオプションとしてOTPWを追加する必要があります。

信頼できるコンピューターでの認証用にSSHキーが既に設定されていることを前提としているため、通常のパスワードログインを制限する方法でこれを実現したいと考えています。 使用可能な場合はSSHキーを使用し、使用できない場合はOTPWメカニズムにフォールバックします。

これを行うには、SSHログインに関連するファイルのみを変更します。 これにより、ローカルログインやDigitalOceanWebコンソールを介したログインが妨げられることはありません。

SSHPAM構成ファイルを開きます。

sudo nano /etc/pam.d/sshd

ファイルの先頭に向かって、インポートすることを目的としたディレクティブがあります common-auth ファイル。 このファイルを使用すると、SSHセッションでは不要なOTPWシステムを使用せずに通常のパスワード認証を行うことができます。 コメントしてみましょう:

#@include common-auth

この下に、OTPWシステムを使用してパスワード要求を処理できるようにする行をいくつか追加しましょう。

auth    required    pam_otpw.so
session optional    pam_otpw.so

終了したら、ファイルを保存して閉じます。

SSHDを構成する

OTPWを使用するようにSSHデーモンのPAMモジュールを構成したので、適切な値を使用してデーモン自体を構成できます。

root権限でファイルを開き、ファイルをチェックアウトします。

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つのパスワードファイルを作成できます。

に保存される1つのファイル ~/.otpw、は、パスワードセグメントのハッシュ値を1行に1つずつ含みます。 作成する2番目のファイルは、人間が読み取れるワンタイムパスワードセグメントです。このファイルは、安全なデバイスにコピーするか、印刷するか、安全でポータブルな場所に配置する必要があります。

このリストを生成するために必要なのは、 otpw-gen 指図。 これは通常、人間が読めるテキストを標準出力に出力しますが、安全に保管するためにファイルにパイプすることができます。

cd ~
otpw-gen > nothingtosee.txt

これにより、ランダムシードが生成され、パスワードプレフィックスが要求されます。 通常のパスワードに使用するのと同じ常識的なルールを使用する必要があります。 パスワードを覚えておいてください。

その後、あなたは ~/.otpw パスワードサフィックスのハッシュ値を含むファイル(1行に1つずつ):

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で構成したユーザーにログインします。

ssh [email protected]

Password 253: 

ご覧のとおり、OTPWが必要とする接尾辞が付けられています。

まず、プレフィックスパスワードを入力し、次にプレフィックスパスワードとサフィックスの間にスペースを入れずに、同じ行にサフィックスを直接入力します。 必要に応じて、サフィックスファイルに表示されているスペースを保持できます。

したがって、私のプレフィックスパスワードが「crazyburr!to」であり、サフィックスファイルに次のような列があるとします。

249 N4HY RsbH
250 +vAz fawn
251 O4/R ZrhM
252 c6kP jgUT
253 I=aA OKSz
254 aYzA :F64
255 3ezp ZpIq
256 ggIi TD2v

この場合、「crazyburr!toI = aAOKSz」または「crazyburr!toI=aAOKSz」のいずれかを入力できます。

これで、問題なくログインできるようになります。 あなたがあなたをチェックするなら ~/.otpw ファイルの場合、ハッシュされた行の1つがダッシュに置き換えられていることがわかります。

. . .
091icM5kSPVOdcU
274Uf3q/=kTYcu8
229fHfmIsCj7mjQ
---------------
115EzDO6=jM/sOT
143iWCdteSk3kg7
265S+QTGcg+MAZO
174UgXchxsI2g:G
. . .

これは、サフィックスが使用され、無効になったことを意味します。

2人が同時にアカウントにログインしようとすると、OTPWは代わりにプレフィックスパスワードを要求し、その後に3つのサフィックスが続きます。 要求された3つのサフィックスはそれぞれ異なるため、キーロガーを使用して、Enterキーを押してあなたを倒そうとしている人は、それを正常に完了できません。

プロンプトは次のようになります。

Password 161/208/252:

A ~/.otpw.lock この状況でファイルが作成されます。 ログインに成功したら、削除する必要がありますが、状況によってはこれが機能しない原因となるバグがあります。 この場合、手動でロックを解除するだけです。

rm ~/.otpw.lock

次回は、パスワードを1つだけ入力するように求められます。

警告とバグ

正常にログインした後、ロックファイルが自動的に削除されない場合があることを前述しました。 これは、ユーザーがプロンプトを終了する前にCTRL-Cを入力して接続を中止する場合に特に一般的です。

比較的重要なもう1つのバグは、残っている有効なOTPWエントリの数の報告です。 これは通常、PAM構成のセッションラインによって処理されますが、現在は正しく機能していません。

これを回避するために、Wolfgang Kroenerは、このDebianメーリングリストスレッドでこの機能を実装する非常に単純なbashスクリプトを作成しました。 これはさまざまな方法で実装できますが、最も簡単なのは、最後に追加することです。 ~/.bashrc OTPWを実装するユーザーの場合:

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 % oを下回ったときに、パスワードリストを再生成することをお勧めします。 これを行うには、生成コマンドを再実行します。

otpw-gen > anotherfile.txt

これにより、以前のパスワードサフィックスが上書きされるため、この手順の後で使用できなくなります。

結論

OTPWを設定すると、安全でない場所からサーバーにログインするためのオプションが提供されます。 通常のパスワードログインにはいくつかの欠点がありますが、安全でないコンピュータに転送してはならないキーベースのログインと、多くの欠陥や脆弱性がある通常のパスワードログインの中間点を提供します。