SSH の使用法
%Net.SSH パッケージは、SSH (Secure ShellOpens in a new tab) 通信のサポートを提供します。このトピックでは、このパッケージに含まれているクラスについて簡単に説明します。
OpenSSL 3.0 では、プロバイダの新しい構想として、アルゴリズム実装のグループをパッケージ化する手法が導入されています。プロバイダの 1 つにレガシー・プロバイダがあります。OpenSSL でも InterSystems IRIS® データ・プラットフォームでも、既定ではレガシー・プロバイダはロードされません。
レガシー・プロバイダのアルゴリズムを使用しないことをお勧めします。このようなすべてのアルゴリズムは、OpenSSL のドキュメントOpens in a new tabを参照してください。インターシステムズでは、InterSystems IRIS とレガシー・アルゴリズムとの互換性を保証できません。
SSH セッションの作成
%Net.SSH.SessionOpens in a new tab は SSH セッションを表します。このクラスを使用するには、以下の手順を実行します。
-
クラスのインスタンスを作成します。
-
Connect() インスタンスのメソッドを使用して、サーバに接続します。
-
AuthenticateWithKeyPair()、AuthenticateWithUsername()、または AuthenticateWithKeyboardInteractive() を使用して自身をサーバに対して認証します。詳細は、%Net.SSH.SessionOpens in a new tab のクラス・リファレンスを参照してください。
-
%Net.SSH.SessionOpens in a new tab のその他のメソッドを使用して、リモート・システムとの間での単一ファイルの SCP (Secure Copy) 操作の実行、リモート・コマンドの実行、TCP トラフィックのトンネル、または SFTP 操作の実行を行います。クラス・リファレンスの %Net.SSH.SessionOpens in a new tab を参照してください。
例えば、OpenSFTP を使用して、SFTP 操作のセッションを使用します。このメソッドは、SFTP 操作に使用できる %Net.SSH.SFTPOpens in a new tab のインスタンスを参照で返します。次のセクションに示した用例を参照してください。
-
これらのクラスを使用できるサポート・プラットフォームの詳細は、%Net.SSH.SessionOpens in a new tab および %Net.SSH.SFTPOpens in a new tab のクラス・リファレンスを参照してください。
-
OpenSSL 3.0 を使用する SSH 接続では、暗号化アルゴリズムとして Blowfish も CAST もサポートしていません。そのような接続を確立しようとすると接続に失敗します。
OpenSSH と PEM でエンコードされたキー
認証を行うには、公開鍵と秘密鍵のペアと (秘密鍵の) パスフレーズを使用します。公開鍵は OpenSSH 形式でなければならず、秘密鍵は PEM でエンコードする必要があります。ここでは、正しい鍵を持っているかどうかの判断に役立つ、基本情報を提供します。
OpenSSH 形式は、以下の例のようになります (ただし、この形式はここに示す意図的な改行は含みません)。
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCfi2Vq+u0rtt2OC84pyrkq1k7WkrS+s76u3a
+2gdD43KQ2Z3vSUUfksymJjp11JBZEpOtBVIAy221UKdc7j7Qk6sUjZaK8LIy+bzDVwMyFWgVv
Qge7EjdWjrJLBRCDXYML6y1Y25XexThkTWSGyXzGNdr+wfIHYn/mIt0hfvrusauvT/9Wz8K2MG
Aj4BL7UQZpFJrlXzGmewe6++6cZDQQYi0aztwLK798oc9j0LsccdMpqWrjqoU1uANFhYIuUu/T4
7TEhT+e6M+KFYK5TR998eJTO25IjdN2Tgw0feXhQFF/nngbol0bA4auSPaZQsgokKK+E+Q/8UtBd
etEofuV user@hostname
PEM でエンコードした秘密鍵には、ファイルの先頭に以下のようなヘッダがあります。
--{}{}BEGIN RSA PRIVATE KEY{}{}--
ファイルは、同様のフッタで終了します。
--{}{}END RSA PRIVATE KEY{}{}--
例 : SFTP 経由のファイルのリスト作成
次のメソッドは、SFTP を経由してサーバ上のファイルのリストを作成する方法を示しています。
Method SFTPDir(ftpserver, username, password) As %Status
{
set ssh = ##class(%Net.SSH.Session).%New()
set status = ssh.Connect(ftpserver)
set status = ssh.AuthenticateWithUsername(username,password)
//open an SFTP session and get that returned by reference
set status = ssh.OpenSFTP(.sftp)
//get a list of files
set status = sftp.Dir(".",.files)
set i=$ORDER(files(""))
while i'="" {
write $listget(files(i),1),!
set i=$ORDER(files(i))
}
quit $$$OK
}
例 : キーボード・インタラクティブによる認証
以下のターミナル・セッションは AuthenticateWithKeyboardInteractive() の使用方法を示しています。
%SYS>set host="192.168.2.100"
%SYS>set lambda="(u,i,p,f,c) quit $listbuild(c(""password""))"
%SYS>set context("password")="fountain"
%SYS>set sess=##class(%Net.SSH.Session).%New()
%SYS>s status=sess.Connect(host)
%SYS>set status=sess.AuthenticateWithKeyboardInteractive("root",lambda,.context)
例 : リモート・コマンドの実行
以下の例は Execute() の使用方法を示しています。
// %Net.SSH.Session.Execute
// Specify the initial SSH connection information
Set host="192.168.2.37"
Set username = "SSHUser"
Set password = "SSHPassword"
// Set up the initial SSH connection
// localhost <--SSH--> 192.168.2.37
Set sshSession = ##class(%Net.SSH.Session).%New()
Set statusConnection = sshSession.Connect(host)
Set statusConnection = sshSession.AuthenticateWithUsername(username,password)
// Specify the command to execute on the remote host
Set command = "uname -a"
// Execute the command over the SSH connection
// tDevice is a pass-by-reference value to store the raw data passing through the connection
Set statusConnection = sshSession.Execute(command,.tDevice)
例 : ポートの転送
以下の例は ForwardPort() の使用方法を示しています。
// %Net.SSH.Session.ForwardPort
// Specify the initial SSH connection information
Set host="192.168.2.37"
Set username = "SSHUser"
Set password = "SSHPassword"
// Set up the initial SSH connection
// localhost <--SSH--> 192.168.2.37
Set sshSession = ##class(%Net.SSH.Session).%New()
Set statusConnection = sshSession.Connect(host)
Set statusConnection = sshSession.AuthenticateWithUsername(username,password)
// Specify the remote port forward information
Set remotehost = "192.168.2.100"
Set remoteport = 80
// Forward traffic via the SSH connection to a remote host:port
// localhost <--SSH--> 192.168.2.37 --SSHPortFwd--> 192.168.2.100:80
// tDevice is a pass-by-reference value to store the raw data passing through the connection
Set statusConnection = sshSession.ForwardPort(remotehost,remoteport,.tDevice)