前回書いた記事の更新版です。
もう去年の話なんですねえ。
前回の課題
作業手順書簡略化用のCLIログインですが、パスワードを平文で書かないといけないのが欠点でした。
私の環境の作業用端末って最低限のツールしか入っていないので、
Powershellだけで暗号化できるのかと思っていたんですが、いい記事を見つけました。
こいつを使ってパスワードを暗号、複合でセキュアなログインをしたいと思います。
Powershellでの暗号化、複合化
セキュア文字列を復号して平文にする[PowerShell] : バヤシタ
環境
いつものノートPC Windows10です。
どのバージョンから暗号化が使えるのかは調べてません。すいません。
PS C:\Users\masashi\tools> Get-WmiObject Win32_OperatingSystem SystemDirectory : C:\WINDOWS\system32 Organization : BuildNumber : 18363 RegisteredUser : user SerialNumber : 00330-80000-00000-AA868 Version : 10.0.18363 PS C:\Users\masashi\tools> $psversiontable Name Value ---- ----- PSVersion 5.1.18362.628 PSEdition Desktop PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} BuildVersion 10.0.18362.628 CLRVersion 4.0.30319.42000 WSManStackVersion 3.0 PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1
.Netのバージョン
Microsoft .NET Framework 4 Client Profile KB2468871 KB2468871v2 KB2478063 KB2533523 KB2544514 KB2600211 KB2600217 Microsoft .NET Framework 4 Extended KB2468871 KB2468871v2 KB2478063 KB2533523 KB2544514 KB2600211 KB2600217
仕込み(暗号化)
標準入力で暗号化するパスワードを変数に入れます。
(ファイルやコマンドに書くとばれちゃうのでこの方法がいいと思います)
コマンド内の文字列はただのプロンプトになります。
PS C:\Users\masashi\tools> $passwd = read-host "ssh password" -assecurestring ssh password: *******
たぶん暗号化されている。
(それ用の変数に入っている?のでどのみち読めません)
PS C:\Users\masashi\tools> $passwd System.Security.SecureString
仕込み(複合化の準備)
お作法的な手順で複合化します。
Powershellはinsensitiveなので全部小文字で書いちゃいます。
[system.runtime.interopservices.marshal]::が何の文法かわからない…
ですが、ググると .Net系っぽいですね。
Windowsで使われているかもしれませんが、自分で意識して使ったことないです。
複合化は.Netの内部アルゴリズムでやってるということですよね。
今回の手順が必要なのは仕方ないですが、何やってるかはさっぱりですね。
MSのページ見ると一回バイナリ文字列にしてStringオブジェクトがどうのこうのと…
全然わかりません…。
PS C:\Users\masashi\tools> $bstr = [system.runtime.interopservices.marshal]::securestringtobstr($passwd) PS C:\Users\masashi\tools> $bstr 1624188756616
仕込み(複合化)
$bstrをもう一度変換すると平文に複合化されます。
PS C:\Users\masashi\tools> $ttmpass = [system.runtime.interopservices.marshal]::ptrtostringbstr($bstr)
接続する
今回はサブ機のUbuntuデスクトップにログインしてみます。
前回のTeratem CLI構文 + パスワードの部分に上記の変数を当てます。
PS C:\Users\masashi\tools> & 'C:\Program Files (x86)\teraterm\ttermpro.exe' /ssh 192.168.0.10 /user=masashi /passwd=$ttmpass /auth=password
OK!
Teratermのウィザードが立ち上がり
マクロのように自動でパスワードが入力されてログインできました!
本当はGIFで公開したかったのですが、間に合わないので後で載せます。
結び
仕込みが少し面倒ですが、平文を見ることなくパスワード入力ができました。
このまま手順書に書いても大丈夫ですね!
最小限の端末環境前提でWindowsの機能だけでやりましたが、
おとなしくopensslくらいインストールしておいた方がもう少し分かりやすい構文で説明できたと思います。
しかしPowershellでここまで出来るなんて驚きです。
コマンドの豊富さからLinuxが好きだったのですが、Windowsもなかなか馬鹿にできませんね。
でも最近のPowershellは普通にsshも使えるのでこんな回りくどいことしなくてもいいかもw
(ログ取りの問題はありますが)
その他参考サイト
PowerShell でパスワードとかのシークレット文字列を対話入力する
Marshal クラス (System.Runtime.InteropServices) | Microsoft Docs
インストールされている NET Framework セキュリティの更新プログラムと修正プログラムを確認する | Microsoft Docs