最近になって、日本国内のスーパーコンピュータで複数、ログインにOTP(ワンタイムパスワード)の入力を要求する所が増えてきました。ワンタイムパスワードの入力はログインごとに行う必要があるので、ファイルを細かくscpするごとにOTPの入力、となると神経に来るものがあります。
そこで、sshの機能であるControlMasterを使います。これは、接続の度に認証をやり直すのでは無く、認証済みのセッションを束ねて利用するオプションです。
やり方は ~/.ssh/config に次のように書くだけです。(もちろんですが、example.comの所は皆さんの接続先のセンターに変えてください。)
Host example.com
ControlMaster auto
ControlPath ~/.ssh/controlmaster-%h
ControlPersist 60
すべてのセッションが切れてからControlPersist 秒後に束ねる大本の接続が切られ、その場合は再度OTPの入力が必要になります。あとの詳しいことはChatGPT君やman ssh_configでお願いします。
何らかの理由で再接続が必要になった場合、~/.ssh/controlmaster-(ホスト名)を削除してください。
Windowsのssh.exe (VSCodeとか) の場合、通常 C:\Users\ユーザ名\.ssh\config がディレクトリになります。
ところで: OTP導入センターの皆様へ
こういった「当たりまえ」の技法は、ちゃんとセンター側でアナウンスしてほしいなぁと思います。作業をただ煩雑にすると、人はとんでもない抜け道を作り始めます(今回の例で言えば、例えば古いAndroid端末やBluestackを用意してパスコードを誰もが見えるように常時表示するとか、逆向き(スパコン→手元マシンsshd)に接続し始めるとか、接続が切れないように細工した上でオレオレsshdを立ち上げるとか、そういう奴です)。
また、一部のセンターはsshでのログイン元のマシンのブラウザでauthenticatorを起動することを紹介していますが、これでは当該マシンのファイルを閲覧可能な権限(rootではなく一般ユーザーの権限)を誰かが取得した場合、そのままログインが可能になってしまっています。OTPの導入は本来、秘匿鍵がパスフレーズと一緒に奪取されたケースを防ぐためだったはずですが、リスクが変化していません。さらに、OTPの初期登録時のアドレス(=秘密鍵)を何らかの方法でspoofするとそのまま使うことが出来てしまったりという問題があります。本質的には、OTPがseedから計算されるので、公開鍵認証の秘密鍵と同じ所で管理をすると二段階一要素認証にしかなっていない点が急所だと思います。そもそもなぜOTPが必要になったのか(HPCIから言われた、というだけでなく)、果たして何を目的としてOTPを導入するのか、熟考の上決めてほしいものですし、OTPの秘密鍵をどこに保持させるのかもちゃんと考えてほしいです。
セキュリティは雰囲気では実現できません。