PowerVS IBM i 日記(5): 【重要】ssh のパスワード認証を停止し鍵認証に移行する

# ssh のパスワード認証を停止し鍵認証に移行する
これまで ssh トンネルを使って IBM i に接続していました。その ssh セッションではパスワード認証を使っていましたよね。
つまり、インターネットに向けて公開されている sshd がパスワード認証なのです。さらに、今回は、作業ユーザーに ADMIN という分かりやすい名前を付ました。不正アクセスを試みられて当たり前の状態でした。

デプロイ後のシステム値 QMAXSIGN はデフォルトの「3」です。そのため、不正ログインが 3 回試行されると、ユーザープロフィールが「*DISABLED」になり接続できなくなってしまいます。
どんなに複雑で長いパスワードを設定しても、ユーザーが使えなくなるのは困ります。

## 二つの改善点

早急に下記の対策をとる必要があります。

* パスワード認証を停止するまでの作業ユーザー名は分かりにくいものにする
* 速やかにssh のパスワード認証を停止し鍵認証に移行する

## ユーザー・プロフィールは 8文字まで? 10文字使う?

分かりにくいユーザー名を付けるのに、ユーザー名を長くしたいのが人情です。
IBM i で使えるユーザープロフィールの最大長は10文字です。

しかし、**標準では ssh 接続に使えるのは 8 文字まで** になります。
こらは PASE 環境のもとになっている AIX (というか POSIX 標準)の制約を引き継いでいるからです。

[ユーザー名とグループ名の長さの制限](https://www.ibm.com/support/knowledgecenter/ja/ssw_aix_72/security/user_group_name_length.html)

> ユーザー名とグループ名の長さの制限パラメーターのデフォルト値は 9 文字です。 AIX® 5.3 以降では、ユーザー名とグループ名の長さの制限を 9 文字から 256 文字に増やすことができます。 ユーザー名とグループ名の長さの制限パラメーターには終了 NULL 文字があるため、実際の有効な名前の長さは 8 文字から 255 文字までです。

AIX と同様に 9 文字以上のユーザー名を ssh で使う設定が IBM i にもあります。もちろん 10 文字までですが...

[Allowing or Denying Access to the IBM i Secure Shell Daemon (SSHD) Using Group Profiles](https://www.ibm.com/support/pages/allowing-or-denying-access-ibm-i-secure-shell-daemon-sshd-using-group-profiles)

>There is an eight-character limitation on the user profiles that can access the IBM i through SSHD. The eight-character limitation is also placed on any group profile that the user might be a member of. If any of the other members in a group profile have more than eight characters in their user name, access to the system will be denied. In order to get around the eight-character limitation, you can either create system wide environment variable or add a specicial directive to the sshd_config file:
>
ADDENVVAR ENVVAR(PASE_USRGRP_LIMITED) VALUE('N') LEVEL(*SYS)
>
ibmpaseforienv PASE_USRGRP_LIMITED=N


CL コマンドで「ADDENVVAR ENVVAR(PASE_USRGRP_LIMITED) VALUE('N') LEVEL(*SYS)」を実行しておくか、sshd の設定ファイルである「sshd_config」に「ibmpaseforienv PASE_USRGRP_LIMITED=N」を書けば 10 文字までのユーザー名が利用できます。

今回は、システム環境変数で設定しましょう。有効にするには sshd の再起動が必要です。

```
ADDENVVAR ENVVAR(PASE_USRGRP_LIMITED) VALUE('N') LEVEL(*SYS)
ENDTCPSVR SERVER(*SSHD)
STRTCPSVR SERVER(*SSHD)
```

## ユーザーの用意

IBM i 側でユーザーを用意します。
ユーザーを作成し、ホームディレクトリーを作成し、ホームディレクトリーのオーナーを作成したユーザーにします。
そろとそろ IBM i でも CRTUSRPRF でまとめてやってくれると嬉しいのですが...

今回は「YKASFT0731」というユーザーを用意しました。

```
CRTUSRPRF USRPRF(YKASFT0731) PASSWORD(yourPAssword) SRCLS(*SECOFR)HOMEDIR('/home/ykasft0731')
MKDIR DIR('/home/ykasft0731')
CHGOWN OBJ('/home/ykasft0731') NEWOWN(YKASFT0731)
```

## 公開鍵を IBM i に転送

「[こちら](https://qiita.com/6onoda/items/e531050c3f8bf80132e5)」で作った公開鍵を scp でホームディレクトリーに転送します。
scp も ssh と同時に Windows 10 で標準で使えるようになっています。
作業環境がWindowsなのでソースが「.ssh\id_rsa.pub 」と「\」区切りになっています。
まだ、パスワード認証ですね。

```
C:\Users\YASUHIROOnoda>scp .ssh\id_rsa.pub YKASFT0731@158.175.XXX.XXX:/home/ykasft0731/id_rsa.pub
YKASFT0731@158.175.XXX.XXX's password:
id_rsa.pub                                                                            100%  758     2.9KB/s   00:00
```

## 公開鍵と権限の設定

ssh で追加の作業をします。
転送した id_rsa.pub を .ssh/authorized_keys に追記します。
(今回は宛先が存在しないので mv でもよかったのですが)
権限の設定を忘れないようにしましょう。ssh の鍵認証の失敗のほとんどは権限の設定もれです。

```
C:\Users\YASUHIROOnoda>ssh YKASFT0731@158.175.XXX.XXX
YKASFT0731@158.175.XXX.XXX's password:
$ pwd
/home/ykasft0731
$ mkdir .ssh
$ cat id_rsa.pub >> .ssh/authorized_keys
$ chmod 700 .
$ chmod 700 .ssh
$ chmod 600 .ssh/authorized_keys
$ exit
Connection to 158.175.XXX.XXX closed.
```

## 接続テスト

もう一度、ssh で接続するとパスワード無しで接続されます。

```
C:\Users\YASUHIROOnoda>ssh YKASFT0731@158.175.XXX.XXX
$
```

## パスワード認証を停止

IBM i でパスワード認証を停止します。

sshd の設定ファイルは「/QOpenSys/QIBM/UserData/SC1/OpenSSH/etc/sshd_config」になります。
「PasswordAuthentication no」を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/3af9c0b7-4d90-0449-9563-936b596d33c4.png)

sshd を再起動します。

```
ENDTCPSVR SERVER(*SSHD)
STRTCPSVR SERVER(*SSHD)
```

鍵認証の設定をしていないユーザー(存在していないユーザーでも可)で ssh の接続を試みてパスワードが聞かれずに接続拒否されれば OK です。

```
C:\Users\YASUHIROOnoda>ssh qsecofr@158.175.XXX.XXX
qsecofr@158.175.XXX.XXX: Permission denied (publickey,keyboard-interactive).
```

---
当日記のIndexは[こちら](https://qiita.com/6onoda/items/f146c78c0c1bbe905a42)です。

---
許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。