IBM iのSSH接続をイチから設定してみた

　
最近、FFRPGをVSCodeで開発するといったセミナーや記事を目にする事が増えました。
システムエンジニアであれば一度は耳にしたことがあるであろうVSCodeとIBM iをどう連携させるのか、何から始めれば良いのか分からなかったので本記事にて、
<font color="Darkturquoise"><strong>IBM iで開発している人が最初に踏み出す一歩目</strong></font>としてSSH接続についてイチから順を追って説明させていただきます。

丁寧に書いてみましたので最後までお付き合いください！

# 0.環境前提-2024年10月時点
<table>
  <thead>
    <tr>
      <th>環境項目</th> <th>環境名</th>
    </tr>
  </thead>
  <tr>
      <td><strong>PC</strong></td> <td><font color="Darkturquoise"><strong>Windows11</strong></font></td>
  </tr>
  <tr>
    <td>IBM iバージョン</td> <td><font color="Darkturquoise"><strong>V7.3</strong></font></td>
  </tr>
  <tr>
    <td>エミュレーター</td> <td><font color="Darkturquoise"><strong>5250</strong></font>(IBM i Access Client Solutions)</td>
  </tr>
  <tr>
    <td>QCCSID</td> <td><font color="Darkturquoise"><strong>65535</strong></font>(記事内で5035のユーザープロファイルを用意)</td>
  </tr>
  <tr>
    <td>導入済ライセンス</td> <td><font color="Darkturquoise"><strong>5733SC1</strong></font>あり</td>
  </tr>
</table>



# 1.SSH接続とは…？
<font color="Darkturquoise"><strong>S</strong></font>ecure <font color="Darkturquoise"><strong>SH</strong></font>ellの略称で暗号化された通信方法の事を指します。
暗号なので大きな問題は無いですが、時折、セキュリティの脆弱性が報告されます。
IBM i上でも問題とみなされた場合はPTF(不具合修正プログラム:<font color="Darkturquoise"><strong>P</strong></font>rogram <font color="Darkturquoise"><strong>T</strong></font>emporary <font color="Darkturquoise"><strong>F</strong></font>ixの略称)を提供される場合があります。
詳細については、[IBM i World](https://iworldweb.info/column/product/ibm_i_vulnerability_info/ "IBM i World")からご確認ください。

:::note
メール配信設定をすると自動で最新情報をキャッチ出来るようになります！
:::

IBM iの環境が無く、試したい方はフリーのIBM iの開発環境からでもお試しいただけます。
PUB400の導入手順は[コチラ](https://qiita.com/You_name_is_YU/items/256045b1335f72bef66e)
[【VS Code】RPGⅣからFFRPGにConvertしてみた！](https://qiita.com/RiSING_alpha-team/items/7d67690775b6273ac545)

# 2.IBM iでSSH接続するための前提条件
SSH接続をするためには、以下の4つの条件を確認する必要があります。

<table>
  <thead>
    <tr>
      <th></th> <th>確認項目</th> <th>設定値</th>
    </tr>
  </thead>
  <tr>
    <th>A</th> <td>ライセンスプログラム</td> <td><font color="crimson"><strong>5733SC1</strong></font></td>
  </tr>
  <tr>
    <th>B</th> <td>CCSID(コード化文字セット:<font color="Darkturquoise"><strong>C</strong></font>oded <font color="Darkturquoise"><strong>C</strong></font>haracter <font color="Darkturquoise"><strong>S</strong></font>et <font color="Darkturquoise"><strong>ID</strong></font>entifier)</td> <td><font color="crimson"><strong>5035</strong></font></td>
  </tr>
  <tr>
    <th>C</th> <td>HCP(<font color="Darkturquoise"><strong>H</strong></font>ost <font color="Darkturquoise"><strong>C</strong></font>ode <font color="Darkturquoise"><strong>P</strong></font>age)</td> <td><font color="crimson"><strong>939</strong></font><br>(<font color="crimson"><strong>1399</strong></font>も可)</td>
  </tr>
  <tr>
    <th>D</th> <td>SSH接続を開始するためのユーザープロファイル</td> <td><font color="crimson"><strong>QSECOFRか同権限</strong></font>の<br>ユーザープロファイル</td>
  </tr>
</table>

:::note warn
D.のユーザープロファイルがB.の要件を満たしていない場合は、QSECOFRのプロファイルと同等権限のユーザープロファイルの作成を推奨します。
(プロファイルを変更する事で業務に影響を及ぼす可能性があるため)
:::

# 3.前提条件の確認方法
### <font color="Darkturquoise">A.IBM Portable Utilities for iのライセンス・プログラムがあるかの確認</font>

```
WRKSFWAGR
```
上記コマンドを実行→「ソフトウェア契約の処理」画面に赤点線枠内のように
ライセンス・プログラム<font color="crimson"><strong>5733SC1</strong></font>が存在するか確認する。
![ソフトウェア契約の処理画面_20240919.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844144/f8e410dc-aee4-fa1e-8854-806e3f536d14.png)


### <font color="Darkturquoise">B-1.ユーザー「QSECOFR」のCCSIDの確認方法</font>

```
DSPUSRPRF USRPRF(QSECOFR)
```
上記コマンドを実行→4回ページダウン後の5画面目に表示される赤点線枠のコード化文字セット IDの値が<font color="crimson"><strong>5035</strong></font>になっているか確認する。

:::note warn
<font color="crimson"><strong>5035</strong></font>ではなく、<font color="crimson"><strong>＊SYSVAL</strong></font>だった場合はB-2.へ、それ以外の場合はD-1.かD-2.へ

![ユーザープロファイル画面_20240919.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844144/e7f2edea-ef67-991e-6f72-de9ebb7da250.png)
:::

### <font color="Darkturquoise">B-2.システム値のQCCSIDの確認方法</font>
```
DSPSYSVAL SYSVAL(QCCSID)
```
上記コマンドを実行→「システム値表示」画面の「コード化文字セットID」の値が<font color="crimson"><strong>5035</strong></font>になっているか確認する。

:::note warn
<font color="crimson"><strong>5035</strong></font>以外だった場合はD-1.かD-2.へ
![QCCSIDの確認画面_20240919.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844144/9c360b8a-9c8c-fc1f-4655-3b6168df05fc.png)
:::

### <font color="Darkturquoise">C.HCPの確認と変更方法</font>
ASCの場合…
エミュレーターの「通信」タブ→「構成」→「ホスト・コード・ページ」にて<font color="crimson"><strong>939</strong></font>を指定する。
![HCP設定画面_20240919.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844144/6eb0644a-f19d-465a-3a5e-c0e106cbf612.png)

Pcommの場合…
エミュレーターの「通信」タブ→「構成」→「セッション・パラメーター」→「ホスト・コード・ページ」にて<font color="crimson"><strong>5035</strong></font>を指定する。

### <font color="Darkturquoise">D-1.ユーザー「QSECOFR」のCCSIDを「5035」に変更する方法</font>

:::note alert
CCSIDを<font color="crimson"><strong>5035</strong></font>以外の状態でSSHDサーバーを起動すると異常終了するのでCCSIDの変更が必要です。
:::

```
CHGUSRPRF USRPRF(QSECOFR) CCSID(5035) 
SETJOBATR(*CCSID *DATFMT *DATSEP *DECFMT *SRTSEQ *TIMSEP) 
LOCALE('/QSYS.LIB/JA_5035.LOCALE')
```

### <font color="Darkturquoise">D-2.ユーザー「QSECOFR」と同権限のプロファイルのユーザーコピー作成方法</font>
```
WRKUSRPRF USRPRF (QSECOFR)
```
上記コマンドを実行→「ユーザー・プロファイルの処理」画面で「3＝コピー」を実行→ユーザー・プロファイル、パスワードを任意変更します。
(今回は例としてユーザー・プロファイル名をSSHとする)
D-1.のコマンドのUSRPRF(QSECOFR)の部分をUSRPRF(SSH)に変更して実行します。

※QSECOFRを変更せずにSSHDサーバーを起動したい場合には、QShellからSSHDサーバーを起動する方法もあります。



# 4.SSH接続方法
### <font color="Darkturquoise">A-1.ユーザープロファイル「QSECOFR」で開始する方法</font>
SSHDサーバーを開始する時に、以下のコマンドを実行します。
```
STRTCPSVR SERVER(＊SSHD)
```


### <font color="Darkturquoise">A-2.ユーザープロファイル「QSECOFR」以外で開始する方法</font>
<font color="Darkturquoise">2.D-2.</font>で作成したユーザープロファイルでSIGNONし、以下のコマンドを実行します。
```
QSH CMD('/QOpenSys/usr/sbin/sshd')
```

:::note
実行後、「コマンドは終了状況0で正常に終了しました。」と表示されたら成功、それ以外は失敗となるため、[Qshell の終了ステータスまたはシグナルの意味を判断する方法](https://www.ibm.com/support/pages/how-determine-meaning-qshell-exit-status-or-signal)にて説明が記載されているので必要に応じて確認します。
:::

### <font color="Darkturquoise">B.SSHDサーバー起動の確認方法</font>
<font color="Darkturquoise">3.A-1.</font>か<font color="Darkturquoise">2</font>を実行後、起動確認をする場合は以下のコマンドをそれぞれ実行します。
```
NETSTAT OPTION(*CNN)
```
上記コマンドを実行→F14押下→ポート22が一覧にあるか確認します。
```
WRKACTJOB JOB(QP0ZSPWP)
```
上記コマンドを実行→活動ジョブ処理一覧にジョブQP0ZSPWP、機能PGM-sshdがあるか確認します。

# 5.SSHDサーバー終了方法
SSHDサーバーを終了する時に、以下のコマンドを実行します。
```
ENDTCPSVR SERVER(*SSHD)
```

:::note warn
暗号化通信なので問題は無いですが、念のためSSHDサーバーを使った作業を終えたら終了コマンドを実行するようにしましょう。
:::

以上となります、お疲れ様でした。

# 6.苦戦したところ
当記事の内容を実際に設定していくうえで筆者の環境ですとSSHDサーバーを使用しておりませんでした。暗号化しているとは言え、上司に確認する際、説明をしても中々理解してもらえず、後続の[VS CodeとIBM iの連携をイチから設定してみた](https://qiita.com/RiSING_alpha-team/items/7b5c910c6df111a53ace)の設定に進めず辛かったです。
設定や確認事項に関しては苦戦するほどの難易度では無かったと思いますし、当記事を読んでいただければSSHDサーバーの開始と終了方法についてはマスター出来ると思いますので是非、挑戦してみてください！