%Net.SSH.Session()で公開鍵と秘密鍵を使用してSFTP接続する方法
SFTPサーバ側で公開鍵と秘密鍵を作成し、それをIRISサーバにコピーして、%Net.SSH.Session() の AuthenticateWithKeyPair() を使用してSFTP接続する一連の手順(サンプル)をご紹介します。
【環境】
SFTPサーバ:CentOS8
SFTPクライアント:Windows10 & IRIS2023.1.2
SFTP接続用ユーザ:mysftpuser
【手順】
(1) CentOSでSSHの公開鍵と秘密鍵を作成します (今回は、RSA方式、4096bit)
ssh mysftpuser@172.18.xx.xx でログインし、以下 mysftpuser として作業します。
$ ssh mysftpuser@172.18.xx.xx
password:<pass>
$ ssh-keygen -t rsa -b 4096 # ssh-keygenコマンドは、SSHで利用する認証用の鍵を生成・管理・変換するコマンドです
Generating public/private rsa key pair.
Enter file in which to save the key (/home/mysftpuser/.ssh/id_rsa): <Enter>
Enter passphrase (empty for no passphrase): <pass2> # キーファイルのパスワード。(5)、(6)でSFTP接続するときに使います
# デフォルトで以下に作成されます# 秘密鍵: /home/mysftpuser/.ssh/id_rsa# 公開鍵: /home/mysftpuser/.ssh/id_rsa.pub
(2) CentOSで鍵を準備します
作成した公開鍵 id_rsa.pub を authorized_keys に名前を変更し、各権限を変更します。
$cd /home/mysftpuser/.ssh$ mv id_rsa.pub authorized_keys$ chmod 600 authorized_keys$ chmod 700 /home/mysftpuser/.ssh
(3) CentOS側の公開鍵・秘密鍵をともにSFTPクライアント(Windows)にコピーしておきます
公開鍵 scp mysftpuser@172.18.xx.xx:/home/mysftpuser/.ssh/authorized_keys C:\temp\authorized_keys
秘密鍵 scp mysftpuser@172.18.xx.xx:/home/mysftpuser/.ssh/id_rsa C:\temp\id_rsa
(4) CentOSで鍵認証以外のアクセスを拒否するように設定します
SSHのセキュリティ設定(sshd_config) を変更します。
$ vi /etc/ssh/sshd_config にて以下のようにそれぞれ変更します。
PubkeyAuthentication yes <-- 鍵認証有効
PasswordAuthentication no <-- パスワード接続不許可
# sshdを再起動後、上記が有効になります。$ systemctl stop sshd.service$ systemctl start sshd.service
(5) SFTPクライアント側設定を確認します
Windowsクライアントから鍵のないSFTP接続は拒否されることを確認します。
C:\temp>sftp mysftpuser@172.18.xx.xx
mysftpuser@172.18.xx.xx: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
Connection closed
手順(3) でコピーした秘密鍵 id_rsa を以下フォルダにコピーします。 ※<username> はWindowsログインユーザ
C:\Users\<username>\.ssh
すると、SFTPコマンドは上記のid_rsaを使うため、接続は成功します。
C:\temp>sftp mysftpuser@172.18.xx.xx
Enter passphrase for key 'C:\Users\<username>\.ssh\id_rsa': <pass2>
Connected to 172.18.xx.xx.
sftp>
(6) IRISコマンドでの実行がうまくいくか確認します
set ssh=##class(%Net.SSH.Session).%New()
write ssh.Connect("172.18.xx.xx",22)
;; 第1引数 SFTPユーザ名;; 第2引数 公開鍵 (手順3 でコピーしたもの);; 第3引数 秘密鍵 (手順5 のSFTPコマンドで動いたもの);; 第4引数 パスフレーズ (秘密鍵用に指定したもの:<pass2>)write ssh.AuthenticateWithKeyPair("mysftpuser","c:\temp\authorized_keys","C:\Users\<username>\.ssh\id_rsa","<pass2>")
write ssh.OpenSFTP(.sftp)
write sftp.Get("/home/mysftpuser/a.txt","C:\temp\a.txt") ;; サーバの a.txt を C:\temp にコピー
ファイル名に日本語を含むとエラーになったり、ファイルの中身が文字化けしてしまう場合、SFTPサーバとクライアントの文字コードが異なることが原因となっている可能性があります。
その場合は、%Net.SSH.Session() クラスのプロパティを使用して文字コードを指定します。
killset ssh=##class(%Net.SSH.Session).%New()
set ssh.RemoteCharset="UTF8"// SFTPサーバ環境の文字コード(今回のサンプルでは CentOS8)set ssh.LocalCharset="SJIS"// クライアント環境の文字コード(今回のサンプルでは Windows)write ssh.Connect("172.18.xx.xx",22)
write ssh.AuthenticateWithKeyPair("mysftpuser","c:\temp\authorized_keys","C:\Users\<username>\.ssh\id_rsa","<pass2>")
write ssh.OpenSFTP(.sftp)
write sftp.Get("あいうえお.txt","C:\temp\あいうえお.txt")
【ご参考】