paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

コマンドからteratermを起動して一発ログイン 完全版

前回書いた記事の更新版です。
もう去年の話なんですねえ。

paloma69.hatenablog.com

前回の課題

作業手順書簡略化用の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

f:id:paloma69:20200409233440p:plain

OK!

Teratermのウィザードが立ち上がり
マクロのように自動でパスワードが入力されてログインできました!

f:id:paloma69:20200409233459p:plain

本当はGIFで公開したかったのですが、間に合わないので後で載せます。

結び

仕込みが少し面倒ですが、平文を見ることなくパスワード入力ができました。
このまま手順書に書いても大丈夫ですね!

最小限の端末環境前提でWindowsの機能だけでやりましたが、
おとなしくopensslくらいインストールしておいた方がもう少し分かりやすい構文で説明できたと思います。

しかしPowershellでここまで出来るなんて驚きです。
コマンドの豊富さからLinuxが好きだったのですが、Windowsもなかなか馬鹿にできませんね。

でも最近のPowershellは普通にsshも使えるのでこんな回りくどいことしなくてもいいかもw
(ログ取りの問題はありますが)

その他参考サイト

PowerShell でパスワードとかのシークレット文字列を対話入力する

Marshal クラス (System.Runtime.InteropServices) | Microsoft Docs

インストールされている NET Framework セキュリティの更新プログラムと修正プログラムを確認する | Microsoft Docs