日本語2962のIBM i でQCCSIDが65535とか5026の環境でSSHDを開始する方法

# はじめに
IBM i の世界でもセキュアなファイル転送やリモート・コマンドの実行など、着実にSSHで接続するケースが増えてきていると思います。
IBM i でSSHDを開始するには、```STRTCPSVR SERVER(*SSHD)``` コマンドを実行すれば良く、また ```CHGTCPSVR SVRSPCVAL(*SSHD) AUTOSTART(*YES)``` の設定をしておくことで、IPL後に自動開始させることもできます。
しかし、日本語2962でシステム値QCCSIDが65535や5026のIBM i ではこれらの設定でSSHDを開始させることができず、別途開始する仕組みを整える必要があります。

そこで今回はそのような環境でSSHDを開始する方法についてまとめてみました。

# セットアップの流れ
以下のステップで手動開始する設定を行っていきます。
1. SSHD開始用ユーザーの作成
1. SSHホスト鍵の生成
1. SSHD開始コマンド実行プログラムの作成
1. スタート・アップ・プログラムへの組み込み

## 1. SSHD開始用ユーザーの作成
セットアップでは英小文字を入力・使用しますので、ホスト・コード・ページが「939 日本 (拡張ローマ字)」の通信構成を行ったエミュレーター・セッションを使用してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1305251/e04fc05f-acaa-0566-0f1c-0084747fe776.png)

サイン・オン後はまずジョブのCCSIDを5035にしておきます。
```: ジョブのCCSIDの変更
CHGJOB CCSID(5035)
```

それではここからセットアップを行っていきます。
まず、SSHD開始処理で使用するユーザー・プロファイルSSHDUSRを作成します。
作成するユーザー・プロファイルは、
・パスワード: *NONE
・状況: *DISABLED
・特殊権限: *ALLOBJ
・CCSID: 5035
・ロケール: /QSYS.LIB/JA_5035.LOCALE
・ロケール・ジョブ属性: *CCSID
とします。\*ALLOBJ特殊権限を持たせるため、通常のアクセスでは使用できないようにパスワードなしで\*DISABLEDにしています。

```: ユーザーSSHDUSRの作成
CRTUSRPRF USRPRF(SSHDUSR) PASSWORD(*NONE) STATUS(*DISABLED) SPCAUT(*ALLOBJ) CCSID(5035) SETJOBATR(*CCSID) LOCALE('/QSYS.LIB/JA_5035.LOCALE')
```
次に作成したユーザーSSHDUSRのホーム・ディレクトリーを作成し、所有者をSSHDUSRにしておきます。
```: ユーザーSSHDUSRのホーム・ディレクトリーの作成
CRTDIR DIR('/home/SSHDUSR')
CHGOWN OBJ('/home/SSHDUSR') NEWOWN(SSHDUSR)
```

## 2. SSHホスト鍵の生成
SSHDのホスト鍵のペアを生成します。まずPASE for i のターミナルに入ります。
```: PASE for i ターミナルの開始
CALL QP2TERM
```

PASE for i のターミナルで以下のコマンドを順に実行し、実行後はF3キーでPASE for i のターミナルから抜けます。
```: 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 ''
```

以下が上記の各コマンドの実行結果です。
<details open><summary>PASE for i ターミナルでの実行結果</summary>

```: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]-----+                                                          
   #                                                                            
```
</details>

なお、既存のホスト鍵ペアが既に存在する場合には以下のようなメッセージが出されますので、再作成するか、そのまま既存を使用するか選択できます。(以下はそのまま既存を使用する場合の例で 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から引き継がれるようにしています。
```:STRSSHD.CLP
     PGM                                                 

     SBMJOB     CMD(QSH CMD('/QOpenSys/usr/sbin/sshd')) +
                  JOB(SSHD) JOBQ(QSYS/QSYSNOMAX) +
                  USER(SSHDUSR) CCSID(*USRPRF)

     ENDPGM                                              
```

このCLプログラムは借用権限を使用してユーザーSSHDUSRの権限で動くようにコンパイルします。
作成したタイミングではプログラム・オブジェクトの所有者はコンパイルを実行したユーザーとなっていますので、プログラム・オブジェクトが作成された後に所有者をSSHDUSRに変更しておきます。
```: CLプログラムSTRSSHDのコンパイル
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です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1305251/24290381-4453-eed2-6669-e68f3afe6dcf.png)

```NETSTAT OPTION(*CNN)``` で見るとsshがリッスン状態になっていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1305251/d6dad7f6-a2e9-5dfd-18be-8127f572b08b.png)

ちなみに、SSHDの終了はQCCSIDが65535であっても、```ENDTCPSVR SERVER(*SSHD)``` で終了できます。