【AIX】ログインとユーザー認証についてまとめてみた(基本編)

AIXのログインとユーザー認証について、教科書レベルの内容をまとめてみました。
実機での検証で確かめたことも置いておきます。

内容の加筆修正は随時行います。
***
### 実機環境
+ AIX 7.3.0.0（TL1 SP1）
+ openssh.base.server 8.1.102

## 概要
AIXのログインとユーザー認証プロセスについて、フロー図を作ってみました。以降はこのフロー図に従って順に内部的な動きを見ていきます。

```mermaid
flowchart TB
  rlog_client[rlogin<br>telnet<br>ssh]-->rlog_server[rlogind<br>telnetd<br>sshd]
  subgraph "`**Server**`"
  get[getty]--->login[ログインプロンプトの表示]    
      login---input1[ユーザーによるログイン名の入力]
      input1---input2[ユーザーによるパスワードの入力]
      input2---B{ユーザー名とパスワードの確認（パスワード認証方式）}
      B---|False| false[ログエントリー追加<br>/etc/security/failedlogin]
      B---|True| true[ログエントリー追加<br>/etc/utmp,/var/adm/wtmp]
      true---env[環境の設定]
      env---motd[ /etc/motdの表示]
      motd--->sh[shellの起動]
      rlog_server-->input1
  end
```

この記事を書くきっかけにもなった、AIX,シェルなどの環境設定部分（図の「環境設定」～「シェルの起動まで」）については別途記事を書こうと思います。
## loginの要求
図と照らしあわると「ユーザーによるログイン名の入力」に向かう矢印にあたる箇所の話です。
<br>
AIXのユーザーのログイン形態は以下2種類と言われています。
1. gettyが待機するポートからのログイン
2. TCP/IPネットワーク経由でサーバー（login）プログラムを起動させるログイン

上記は2つともログイン要求の仕組みに違いはあるものユーザー認証の仕組みはパスワード認証方式の場合同じため、それぞれのログイン要求について述べ、ユーザー認証についてはまとめて記載します。

***
#### 1. getty(/usr/sbin/getty)が待機するポートからのログイン

端末を使ったサーバーへの直接ログインがこのログイン形態です。流れは以下の通りです。
1. init起動
2. gettyをスタートさせる
3. gettyが待ち受けるポート(コンソール・デバイス)に端末が接続される
4. ログイン・プロンプトの表示
5. 端末からの入力


細かい部分を見ていきます。

##### <INS>gettyが待ち受けるポートは/etc/initabにて設定できます</INS>
`grep getty /etc/inittab`にて内容を確認できます。
<details><summary>以下、実機での出力</summary>

```
cons:0123456789:respawn:/usr/sbin/getty /dev/console
```
※この場合、待ち受けているポートは/dev/consoleになります。
</details>

##### <INS>現在使用しているコンソール・デバイスは`lscons`で確認可能です。</INS>

<details><summary>実機でHMCからのVterm（/dev/vty）接続の場合、出力は以下のようになります</summary>

```
# lscons
/dev/vty0
```
</details>

##### <INS>各ポートの構成は/etc/security/login.cfgにて属性と値で設定できます。</INS>
内容は`cat`コマンドなどで確認可能です。詳細な属性の説明は設定ファイル内に記載ありますが、こちらのドキュメントにも記載があります。
(https://www.ibm.com/docs/en/aix/7.3?topic=files-logincfg-file)


<details><summary>以下、/etc/security/login.cfgの属性値を実機で確認したものです。</summary>

``` /etc/security/login.cfg（一部抜粋）
default:
        sak_enabled = false
        logintimes =
        logindisable = 0
        logininterval = 0
        loginreenable = 0
        logindelay = 0

・・・・

usw:
        shells = /bin/sh,/bin/bsh,/bin/csh,/bin/ksh,/bin/tsh,/bin/ksh93,/bin/bash,/usr/bin/sh,/usr/bin/bsh,/usr/bin/csh,/usr/bin/ksh,/usr/bin/tsh,/usr/bin/ksh93,/usr/bin/bash,/usr/bin/rksh,/usr/bin/rksh93,/usr/sbin/uucp/uucico,/usr/sbin/snappd
        maxlogins = 32767
        logintimeout = 60
        maxroles = 8
        auth_type = STD_AUTH
        pwd_algorithm = ssha256
        unix_passwd_compat = true

```
</details>

:::note info
/etc/security/login.cfgではherald属性にてログイン・プロンプトの設定ができます。
:::

```/etc/security/login.cfg（一部抜粋）
 herald        Specifies the initial message to be printed out when getty or
               login prompts for a login name.  This value is a string that is
               written out to the login port.  If the herald is not specified
               for a port or in the default stanza, then the default herald is
               gotten from the message catalog associated with the language
               set in /etc/environment.
```


### 実機でログインプロンプトの変更をやってみた
デフォルト
```
AIX Version 7
Copyright IBM Corporation, 1982, 2022.
Console login:
```

viでPortのスタンザを変更
```
default:
        herald = "login to console: "
        ・・・
```

exitしてログインプロンプト表示させてみると、、、
```
login to console:
```


#### 2. TCP/IPネットワーク経由でログイン

rlogin,telnet,sshログインがこのログイン形態にあたります。流れは以下の通りです。(rlogind,telnetd,sshdがactive状態が前提）
1. クライアントからrlogin,telnet,sshコマンドの発行
2. サーバーとの通信確立
3. rlogind,telnetd,sshdからlogin要求
4. ログイン名の入力

以下、細かい部分です。
+ 前提のrlogind,telnetd,sshdの状態は`lssrc -s サービス名`で確認できます
```
# lssrc -s sshd
Subsystem         Group            PID          Status
 sshd             ssh              7274760      active
```
rlogind,telnetdについてはinetdの子プロセスとして動きます。
そのため、/etc/inetd.confにてrlogind,telnetdが有効になるように以下のような記載が存在する必要があります。
```:/etc/inetd.conf
telnet  stream  tcp6    nowait  root    /usr/sbin/telnetd      telnetd -a  #telnetの場合
login   stream  tcp6    nowait  root    /usr/sbin/rlogind      rlogind     #rloginの場合
```
:::note warn
AIX7.3ではセキュリティの都合でデフォルトではコメントアウトされているので注意が必要です
:::

sshdについてはinetdではなくその上位のsrcmstrの子プロセスで動くため/etc/inetd.confの編集は必要ありません。
また、/etc/ssh/sshd_configで詳細の設定が可能です。※ここでsshについて内容を書くと長くなるため割愛します。


***
### ユーザーの認証
図と照らしあわると「ユーザーによるログイン名の入力」～「ログエントリーの追加」にあたる箇所の話です。
ユーザーの認証については以下の前提条件があります。
+ 端末からのログインの場合、対象ユーザーの属性値loginがtrueであること
+ TCP/IPネットワーク経由のログインの場合、対象ユーザーの属性値rloginがtrueであること

設定は`chuser login=true ユーザー名` `chuser rlogin=true ユーザー名`で設定をするか、`smitty chuser`でも設定できます
```
  User can LOGIN?                                     true                   + #login属性
  User can LOGIN REMOTELY(rsh,tn,rlogin)?             true                   + #rlogin属性
```
ユーザー認証(パスワード認証方式)の流れは以下の通りです。

```mermaid
flowchart TB
    ユーザー名を入力-->B{パスワードが必要}
    subgraph loginプログラム
        B{パスワードが必要}
        subgraph usw_verify
            C{uswスタンザの検査に通過}---bb[ /etc/security/login.cfg ]
        end
    B---|True| true[「Password:」の表示<br>「invis」端末属性の適用]
    B---|False| usw_verify
    end
    true---inp[パスワードの入力]
    inp---D{パスワードが妥当か}
    subgraph loginプログラム
        D---|False| fal[ログ・エントリーの追加<br>/etc/security/failedlogin]
        D---|True| usw_verify
        fal---relogin[loginリトライ]
        usw_verify---|False| メッセージの表示
        usw_verify---|True| a[ログイン成功]
        style a fill:#f9f,stroke:#333,stroke-width:4px
    end
```

実際試しにログインを失敗(パスワード入力ミス)してみました。
```
login to console: root
root's Password:
You entered an invalid login name or password.
login: root
root's Password:
You entered an invalid login name or password.
login: root
root's Password:
*******************************************************************************
*                                                                             *
*                                                                             *
*  Welcome to AIX Version 7.3!                                                *
*                                                                             *
*                                                                             *
*  Please see the README file in /usr/lpp/bos for information pertinent to    *
*  this release of the AIX Operating System.                                  *
*                                                                             *
*                                                                             *
*******************************************************************************
2 unsuccessful login attempts since last login.
Last unsuccessful login: Sun Oct  6 21:21:13 CDT 2024 on /dev/vty0
Last login: Sun Oct  6 21:17:41 CDT 2024 on /dev/vty0
```

すると/etc/security/failedloginに記録されました。（diff差分で確認）
```
[haship10t@root]/# diff loginfail1.txt loginfail2.txt
3c3
< f▒▒▒UNKNOWN_USERvty0|
f▒▒UNKNOWN_USERvty0|f▒▒?
・・・(f▒8▒hashinokvty0e*g<▒
---
> f▒▒▒UNKNOWN_USERvty0|
・・・(f▒8▒hashinokvty0e*g<▒rootvty0e0gE▒rootvty0e0gE▒
```