はじめに
IBM i の世界でもセキュアなファイル転送やリモート・コマンドの実行など、着実にSSHで接続するケースが増えてきていると思います。
IBM i でSSHDを開始するには、STRTCPSVR SERVER(*SSHD)
コマンドを実行すれば良く、また CHGTCPSVR SVRSPCVAL(*SSHD) AUTOSTART(*YES)
の設定をしておくことで、IPL後に自動開始させることもできます。
しかし、日本語2962でシステム値QCCSIDが65535や5026のIBM i ではこれらの設定でSSHDを開始させることができず、別途開始する仕組みを整える必要があります。
そこで今回はそのような環境でSSHDを開始する方法についてまとめてみました。
セットアップの流れ
以下のステップで手動開始する設定を行っていきます。
- SSHD開始用ユーザーの作成
- SSHホスト鍵の生成
- SSHD開始コマンド実行プログラムの作成
- スタート・アップ・プログラムへの組み込み
1. SSHD開始用ユーザーの作成
セットアップでは英小文字を入力・使用しますので、ホスト・コード・ページが「939 日本 (拡張ローマ字)」の通信構成を行ったエミュレーター・セッションを使用してください。
サイン・オン後はまずジョブのCCSIDを5035にしておきます。
CHGJOB CCSID(5035)
それではここからセットアップを行っていきます。
まず、SSHD開始処理で使用するユーザー・プロファイルSSHDUSRを作成します。
作成するユーザー・プロファイルは、
・パスワード: *NONE
・状況: *DISABLED
・特殊権限: *ALLOBJ
・CCSID: 5035
とします。*ALLOBJ特殊権限を持たせるため、通常のアクセスでは使用できないようにパスワードなしで*DISABLEDにしています。
CRTUSRPRF USRPRF(SSHDUSR) PASSWORD(*NONE) STATUS(*DISABLED) SPCAUT(*ALLOBJ) CCSID(5035)
次に作成したユーザーSSHDUSRのホーム・ディレクトリーを作成し、所有者をSSHDUSRにしておきます。
CRTDIR DIR('/home/SSHDUSR')
CHGOWN OBJ('/home/SSHDUSR') NEWOWN(SSHDUSR)
2. SSHホスト鍵の生成
SSHDのホスト鍵のペアを生成します。まずPASE for i のターミナルに入ります。
CALL QP2TERM
PASE for i のターミナルで以下のコマンドを順に実行し、実行後はF3キーでPASE for i のターミナルから抜けます。
cd /QOpenSys/QIBM/UserData/SC1/OpenSSH/etc
ssh-keygen -t dsa -b 1024 -f ssh_host_dsa_key -N ''
ssh-keygen -t rsa -b 4096 -f ssh_host_rsa_key -N ''
ssh-keygen -t ecdsa -b 256 -f ssh_host_ecdsa_key -N ''
ssh-keygen -t ed25519 -b 256 -f ssh_host_ed25519_key -N ''
以下が上記の各コマンドの実行結果です。
PASE for i ターミナルでの実行結果
/QOpenSys/usr/bin/-sh
#
> cd /QOpenSys/QIBM/UserData/SC1/OpenSSH/etc
#
> ssh-keygen -t dsa -b 1024 -f ssh_host_dsa_key -N ''
Generating public/private dsa key pair.
Your identification has been saved in ssh_host_dsa_key.
Your public key has been saved in ssh_host_dsa_key.pub.
The key fingerprint is:
SHA256:VyaFaVakEKi0Jnql5KuksjF1Qm5kcLOvC6VB7BDaHko qsecofr@IBMI.XXX.LOCAL
The key's randomart image is:
+---[DSA 1024]----+
|o o .o. =+ |
|o= o. . .=o |
|oEB. o oo o |
|=Boo= + |
|o=B=o S . |
|.*++ . |
|=o.. |
|++.. |
|=o. |
+----[SHA256]-----+
#
> ssh-keygen -t rsa -b 4096 -f ssh_host_rsa_key -N ''
Generating public/private rsa key pair.
Your identification has been saved in ssh_host_rsa_key.
Your public key has been saved in ssh_host_rsa_key.pub.
The key fingerprint is:
SHA256:wPTTzggOhPeiznGd4sRZI65HzsNwHXGRoC3xE5UwSy0 qsecofr@IBMI.XXX.LOCAL
The key's randomart image is:
+---[RSA 4096]----+
| .o B=o+ |
| ...OE==. |
| .+.O+o . |
| o+=+ = |
| + B.+S o |
| + X + |
| o & . |
| + B |
| . . |
+----[SHA256]-----+
#
> ssh-keygen -t ecdsa -b 256 -f ssh_host_ecdsa_key -N ''
Generating public/private ecdsa key pair.
Your identification has been saved in ssh_host_ecdsa_key.
Your public key has been saved in ssh_host_ecdsa_key.pub.
The key fingerprint is:
SHA256:NKwUKm5zbVfqU+QK8uB4TiVr47aX3U0VvQbEPxJRpH4 qsecofr@IBMI.XXX.LOCAL
The key's randomart image is:
+---[ECDSA 256]---+
| . oo++ |
| . o +o .|
| . . . + o .+..|
| . . o o * ...= |
| + = * S o ooE.|
| . = O + o . . |
| . B .o+. o |
| *..o ... . |
| .+o |
+----[SHA256]-----+
#
> ssh-keygen -t ed25519 -b 256 -f ssh_host_ed25519_key -N ''
Generating public/private ed25519 key pair.
Your identification has been saved in ssh_host_ed25519_key.
Your public key has been saved in ssh_host_ed25519_key.pub.
The key fingerprint is:
SHA256:t6GxhDGAq+MEOk/Jd2c/2v2FusH1oG1WPWA+2l81qPc qsecofr@IBMI.XXX.LOCAL
The key's randomart image is:
+--[ED25519 256]--+
| .. |
| . . |
| . o o |
|. . + o o .|
|oo . . S o +oo+|
|=.+ . ..o= +++.=+|
|o= . . oo..o+o= +|
| .. .o..=o..|
| ....+o.E |
+----[SHA256]-----+
#
なお、既存のホスト鍵ペアが既に存在する場合には以下のようなメッセージが出されますので、再作成するか、そのまま既存を使用するか選択できます。(以下はそのまま既存を使用する場合の例で n で応答しています)
/QOpenSys/usr/bin/-sh
#
> cd /QOpenSys/QIBM/UserData/SC1/OpenSSH/etc
#
> ssh-keygen -t dsa -b 1024 -f ssh_host_dsa_key -N ''
Generating public/private dsa key pair.
ssh_host_dsa_key already exists.
Overwrite (y/n)?
> n
#
3. SSHD開始コマンド実行プログラムの作成
SSHD開始コマンドは QSH CMD('/QOpenSys/usr/sbin/sshd')
となります。これをユーザーSSHDUSRでサブシステムQSYSWRKにバッチ投入するCLプログラムSTRSSHDを作成します。バッチ投入されるジョブのCCSIDはユーザーSSHDUSRのCCSIDから引き継がれるようにしています。
PGM
SBMJOB CMD(QSH CMD('/QOpenSys/usr/sbin/sshd')) +
JOB(SSHD) JOBQ(QSYS/QSYSNOMAX) +
USER(SSHDUSR) CCSID(*USRPRF)
ENDPGM
このCLプログラムは借用権限を使用してユーザーSSHDUSRの権限で動くようにコンパイルします。
作成したタイミングではプログラム・オブジェクトの所有者はコンパイルを実行したユーザーとなっていますので、プログラム・オブジェクトが作成された後に所有者をSSHDUSRに変更しておきます。
CRTCLPGM PGM(QGPL/STRSSHD) SRCFILE(QGPL/QCLSRC) USRPRF(*OWNER)
CHGOBJOWN OBJ(QGPL/STRSSHD) OBJTYPE(*PGM) NEWOWN(SSHDUSR) CUROWNAUT(*REVOKE)
4. スタート・アップ・プログラムへの組み込み
作成したCLプログラムSTRSSHDの実行をスタート・アップ・プログラムの一番最後に組み込めば、IPL後にSSHDが自動で開始されるようになります。
なお、スタート・アップ・プログラムはQPGMRで動きます。
今回作成したプログラムはそのプログラムの所有者であるSSHDUSRの権限で実行されます。
そのため、プログラム内のSBMJOBコマンドで USER(SSHDUSR)
を指定しているものの、ユーザーQPGMRがユーザーSSHDUSRに対して使用権限を持つ必要はなく、スタート・アップ・プログラムへの組み込みは単純にCALLコマンドでの実行のみで良い形となります。
...
CALL PGM(QSYS/QWCSWTRS)
MONMSG MSGID(CPF0000)
NOWTRS:
/* START SSHD */
CALL PGM(QGPL/STRSSHD)
RETURN
CHGVAR VAR(&CPYR) VALUE(&CPYR)
ENDPGM
終わりに
実際にスタート・アップ・プログラムに組み込んでSSHDを自動開始させた際のWRKACTJOBコマンドで見た活動ジョブの様子です。
サブシステムQSYSWRK配下で現行ユーザーがSSHDUSR、機能がPGM-sshdのジョブQP0ZSPWPが動いていればOKです。
NETSTAT OPTION(*CNN)
で見るとsshがリッスン状態になっていますね。
ちなみに、SSHDの終了はQCCSIDが65535であっても、ENDTCPSVR SERVER(*SSHD)
で終了できます。