【AIX】ログイン後のシステム環境設定プロセスとそれに関するファイル

ログイン後のシステムの環境設定（基本環境、シェルの環境設定など）について、設定ファイルの使い方の備忘も兼ねてまとめてみました。

前回の記事にてログイン成功までのログインプロセスは簡単に説明しています。

https://qiita.com/hashiwood/items/7c7e89683eb9ecd32574

検証環境は前回と同じで以下の通りです。
### 環境
+ AIX 7.3.0.0（TL1 SP1）

## ログイン後の挙動について
ログイン成功後は様々な設定ファイルが読み込まれて環境変数やシェルの環境設定が行われていきます。

```mermaid
flowchart TB
    subgraph ログインの成功
    end
    subgraph 環境の設定
        direction LR
        file1[ /etc/environment]o--ofile2[ /etc/security/environ]o--ofile3[ /etc/security/limits]o--ofile4[ /etc/security/user]
    end
    subgraph motdの表示
        motd[ /etc/motd]
    end
    subgraph shellの起動
        sh1[ /etc/profile]-->sh3[ $HOME/.profile]-->sh4[ $HOME/.kshrc]
    end
    ログインの成功-->環境の設定
    環境の設定-->motdの表示
    motd---shellの起動
```

## ログイン後の環境設定に関するファイルたち

AIXでログイン後に設定ファイルとして扱われるものを以下に整理してみました。
- /etc/motd
- /etc/environment
- /etc/profile
- /etc/security/environ
- /etc/security/limits
- /etc/security/user
- $HOME/.profile
- $HOME/.kshrc

考えずに分類するとわかりにくいので/etc配下と/etc/security配下、$HOME配下で分けてまとめます。

### <INS>/etc配下の設定ファイル</INS>
etc配下の設定ファイルの特徴として全ユーザーで共通の設定ができます。一方でデフォルトでrootユーザーでないと書き込みできないため注意が必要です。

###### /etc/motd
motd（message of the day）はユーザーがシステムにログインすると表示されます。表示内容は直接/etc/motdテキストファイルに格納します。
<details><summary>以下、実機にて確認（デフォルト値）</summary>

```
*******************************************************************************
*                                                                             *
*                                                                             *
*  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.                                  *
*                                                                             *
*                                                                             *
*******************************************************************************
```
</details>

###### /etc/environment
すべてのプロセス用の基本的な環境を指定する変数が記述されています。
この設定ファイルはログイン後、一番初めに読み込まれます。

[公式ドキュメント](https://www.ibm.com/docs/ja/aix/7.3?topic=files-etcenvironment-file)にも内容の説明があるため記法などの説明は割愛します。基本的な環境を構成する変数例は以下です。

| 変数 | 説明 | 
|:-----------|:------------|
| HOME       | HOMEディレクトリ        |
| LANG       | ロケール名（国/地域別情報）      | 
| NLSPATH    | メッセージ・カタログのパス      |
| LOCPATH    | ロケールファイルのパス        |
| PATH       | コマンドを探すときに検索するディレクトリ       | 
| TZ         | 時間帯情報     | 


##### /etc/profile
ログインシェルが起動した後に実行されるスクリプトです。
すべてのユーザーから参照されます。
$HOME配下の個別ユーザー設定によって、ここで設定した変数は上書きされます。デフォルトではTERM, MAIL,MAILMSGといった変数の設定などを行っています。
<details><summary>以下、実機の設定値（デフォルト）</summary>

```
# @(#)27        1.20  src/bos/etc/profile/profile, cmdsh, bos730, initial_extract 8/9/94 12:01:38
# IBM_PROLOG_BEGIN_TAG
# This is an automatically generated prolog.
#
# bos730 src/bos/etc/profile/profile 1.20
#
# Licensed Materials - Property of IBM
#
# COPYRIGHT International Business Machines Corp. 1989,1994
# All Rights Reserved
#
# US Government Users Restricted Rights - Use, duplication or
# disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
#
# IBM_PROLOG_END_TAG
#
# COMPONENT_NAME: (CMDSH) Shell related commands
#
# FUNCTIONS:
#
# ORIGINS: 3, 26, 27
#
# (C) COPYRIGHT International Business Machines Corp. 1989, 1994
# All Rights Reserved
# Licensed Materials - Property of IBM
#
# US Government Users Restricted Rights - Use, duplication or
# disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
#
################################################################

# System wide profile.  All variables set here may be overridden by
# a user's personal .profile file in their $HOME directory.  However,
# all commands here will be executed at login regardless.

trap "" 1 2 3
readonly LOGNAME

# Automatic logout, include in export line if uncommented
# TMOUT=120

# The MAILMSG will be printed by the shell every MAILCHECK seconds
# (default 600) if there is mail in the MAIL system mailbox.
MAIL=/usr/spool/mail/$LOGNAME
MAILMSG="[YOU HAVE NEW MAIL]"

# If termdef command returns terminal type (i.e. a non NULL value),
# set TERM to the returned value, else set TERM to default lft.
TERM_DEFAULT=lft
TERM=`termdef`
TERM=${TERM:-$TERM_DEFAULT}

# If LC_MESSAGES is set to "C@lft" and TERM is not set to "lft",
# unset LC_MESSAGES.
if [ "$LC_MESSAGES" = "C@lft" -a "$TERM" != "lft" ]
then
        unset LC_MESSAGES
fi

export LOGNAME MAIL MAILMSG TERM

trap 1 2 3

```
</details>


### <INS>/etc/security配下の設定ファイル</INS>
/etc/security配下にはユーザーやグループに関する設定ファイルがあります。一般ユーザーからはアクセスできません。
ユーザーの個別設定をこの配下のファイルを直接編集して設定するものではないので注意が必要です。

##### /etc/security/.profile
ユーザー作成時に$HOME/.profileに書き込む内容を記述します。**ログインには関係ありません**がprofileで検索をかけると表示されるので注意が必要です。

<details><summary>ちなみに、実機のデフォルトは以下の通りです</summary>

```
PATH=/usr/bin:/etc:/usr/sbin:/usr/ucb:$HOME/bin:/usr/bin/X11:/sbin:.

export PATH

if [ -s "$MAIL" ]           # This is at Shell startup.  In normal
then echo "$MAILMSG"        # operation, the Shell checks
fi     
```
</details>

##### /etc/security/environ
ユーザーごとの環境の属性を定義するスタンザを含むファイルです。
mkuserコマンドにてユーザー・スタンザが作成されます。
<details><summary>以下、実機での出力です（デフォルト値）</summary>

```

default:

root:

daemon:

bin:

sys:

adm:

uucp:

guest:

 
```
</details>

##### /etc/security/limits
ユーザーごとのプロセスリソースの制限を定義するファイルです。
initプロセスから始動されるプロセスには適用されません
ログインプロセスを経て作成されるプロセスのみに適用されます。属性値の例は以下の通りです。

| 属性値   | 説明 | 
|:-----------|:------------|
| fsize      | プロセスが生成・拡張できるファイルサイズのソフトリミット |
| core       | プロセスが生成するcoreファイルサイズのソフトリミット      | 
| cpu        | プロセスが使用可能なシステムユニット時間のソフトリミット（秒）   |
| data       | プロセスデータセグメント・サイズのソフトリミット        |
| stack      | プロセススタックセグメント・サイズのソフトリミット       | 
| rss        | プロセスに割り当て可能な物理メモリーサイズのソフトリミット  | 
| nofiles    | プロセスが一度にオープンできるファイルディスクリプターのソフトリミット       |
| fsize_hard | プロセスが生成・拡張できるファイルの最大サイズ    |
| core_hard  | プロセスが生成するcoreファイルの最大サイズ      | 
| cpu_hard   | プロセスが使用可能なシステムユニット時間の最大値（秒）     |
| data_hard  | 最大プロセスデータセグメント・サイズ        |
| stack_hard | 最大プロセススタックセグメント・サイズ       | 
| rss_hard   | プロセスに割り当て可能な最大の物理メモリーサイズ     |
| nofiles_hard | プロセスが一度にオープンできるファイルディスクリプターの最大数        |


<details><summary>以下、実機での出力です(検証環境の設定値)</summary>

```

*
* Sizes are in multiples of 512 byte blocks, CPU time is in seconds
*
* fsize      - soft file size in blocks
* core       - soft core file size in blocks
* cpu        - soft per process CPU time limit in seconds
* data       - soft data segment size in blocks
* stack      - soft stack segment size in blocks
* rss        - soft real memory usage in blocks
* nofiles    - soft file descriptor limit
* fsize_hard - hard file size in blocks
* core_hard  - hard core file size in blocks
* cpu_hard   - hard per process CPU time limit in seconds
* data_hard  - hard data segment size in blocks
* stack_hard - hard stack segment size in blocks
* rss_hard   - hard real memory usage in blocks
* nofiles_hard - hard file descriptor limit
*
* The following table contains the default hard values if the
* hard values are not explicitly defined:
*
*   Attribute        Value
*   ==========    ============
*   fsize_hard    set to fsize
*   cpu_hard      set to cpu
*   core_hard         -1
*   data_hard         -1
*   stack_hard      8388608
*   rss_hard          -1
*   nofiles_hard      -1
*
* NOTE:  A value of -1 implies "unlimited"
*

default:
        fsize = -1
        core = 2097151
        cpu = -1
        data = -1
        rss = 65536
        stack = 65536
        nofiles = 2000

root:
        data = -1
        fsize = -1

daemon:

bin:

sys:

adm:

uucp:

guest:

nobody:

lpd:

esaadmin:
        stack = 393216
        stack_hard = 393216

```
</details>

##### /etc/security/user
ユーザーごとの拡張ユーザー属性が設定されるファイルです。
mkuserでの新規ユーザー作成時にスタンザが追加されます。デフォルト軸性は/usr/lib/security/mkuser.defaultの定義に従います。
拡張ユーザー属性についての設定は今回は割愛します。

<details><summary>以下、実機での出力です（デフォルト値）</summary>

```
*******************************************************************************
* VALID USER ATTRIBUTES FOR /ETC/SECURITY/USER:
*
* account_locked Defines whether the account is locked.  Locked accounts can
*               not be used for login.  Possible values: true or false.
*
* admin         Defines the administrative status of the user.
*               Possible values: true or false.
*
* admgroups     Lists the groups that the user administrates.  The value
*               is a comma-separated list of valid group names.
*
* auth1         Defines primary authentication methods for a user.  This
*               attribute describes Version 3 style authentication methods.
*               Commands login, telnet, rlogin, and su support these
*               authentication methods.
*
*               Possible values: SYSTEM,NONE,token;username.
*
*                       SYSTEM  : Describes normal password authentication in
*                                 Version 3.  Version 4 has extended this
*                                 definition to include loadable modules and
*                                 an authentication grammar.  See SYSTEM
*                                 attribute description below.
*
*                       NONE    : No authentication.
*
*                       token;username  : A generic name for a custom
*                                         authentication method defined in
*                                         /etc/security/login.cfg.
*
*               Example:
*                       If auth1 is:
*                               auth1 = SYSTEM,mylogin;mary
*
*                       And the stanza in /etc/security/login.cfg is:
*                               mylogin:
*                                       program = /etc/myprogram
*
*                       This will do password authentication, and then
*                       invoke the program /etc/myprogram with "mary"
*                       as the first parameter.
*
* auth2         Defines the secondary authentication methods for a user.
*               It is not a requirement to pass this method to login.
*               See auth1 description above for examples.
*
* SYSTEM        Describes Version 4 authentication requirements.  This
*               attribute can be used to describe multiple or alternate
*               authentication methods.  See authenticate() routine and
*               SYSTEM grammar manual pages.
*
*               Possible tokens:
*
*                       files   : local only authentication.
*                       compat  : local plus NIS authentication.
*                                 Version 3 behavior.
*                       DCE     : Distributed Computing Environment
*                                 authentication.
*
*               Example:
*                       SYSTEM = "DCE OR DCE[UNAVAIL] AND compat"
*
* daemon        Defines whether the user can execute programs using the system
*               resource controller (SRC). Possible values: true or false.
*
* default_roles Defines a user's default roles. If set to ALL, the users
*               role attribute will be used as its default roles.
*
* dictionlist   Defines the password dictionaries used when checking new
*               passwords.  The format is a comma-separated list of absolute
*               path names to dictionary files.  A dictionary file contains
*               one word per line where each word has no leading or trailing
*               white space.  Words should only contain 7 bit ASCII characters.
*               All dictionary files and directories should be write protected
*               from everyone except root.  The default is valueless, which is
*               equivalent to no dictionary checking.
*
*               Example dictionary:  /usr/share/dict/words
*                       (Only available if text processing is installed.)
*
* expires       Defines the expiration time for the user account.
*               Possible values: a valid date in the form MMDDHHMMYY or 0.
*               If 0 the account does not expire.  If 0101000070 the account
*               is disabled.  The range for YY is:
*                       00 - 38    years 2000 thru 2038
*                       39 - 99    years 1939 thru 1999
*
* histexpire    Defines the period of time in weeks that a user
*               will not be able to reuse a password.
*               Possible values: an integer value between 0 and 260.
*               26 (approximately 6 months) is the recommended value.
*
* histsize      Defines the number of previous passwords which cannot be
*               reused.
*               Possible values:  an integer value between 0 and 50.
*
* login         Defines whether the user can login.
*               Possible values : true or false.
*
* logintimes    Defines the times a user can login.  The value is a comma
*               separated list of items as follows:
*                       [!][MMdd[-MMdd]]:hhmm-hhmm
*                               or
*                       [!]MMdd[-MMdd][:hhmm-hhmm]
*                               or
*                       [!][w[-w]]:hhmm-hhmm
*                               or
*                       [!]w[-w][:hhmm-hhmm]
*               where MM is a month number (00=January, 11=December), dd is
*               the day of the month, hh is the hour of the day (00 - 23), mm
*               is the minute of the hour, and w is a weekday (0=Sunday, 6=
*               Saturday).
*
* loginretries  The number of invalid login attempts before a user is not
*               allowed to login.  Possible values: a positive integer or 0
*               to disable this feature. (root is exempt from loginretries)
*
* maxage        Defines the maximum number of weeks a password is valid.  The
*               default is 0, which is equivalent to unlimited. Range: 0 to 52.
*
* maxexpired    Defines the maximum number of weeks after maxage that an expired
*               password can be changed by a user.  The default is -1, which
*               is equivalent to unlimited.  Range: -1 to 52.  maxage must
*               be greater than 0 for maxexpired to be enforced.  (root is
*               exempt from maxexpired.)
*
* maxrepeats    Defines the maximum number of times a given character can
*               appear in a password. The default is 8. Range: 0 to PW_PASSLEN.
*
* minage        Defines the minimum number of weeks between password changes.
*               The default is 0.  Range: 0 to 52.
*
* minalpha      Defines the minimum number of alphabetic characters in a
*               password. The default is 0.  Range: 0 to PW_PASSLEN.
*
* minloweralpha Defines the minimum number of lower case alphabetic characters
*               in a password. The default is 0.  Range: 0 to PW_PASSLEN.
*
* minupperalpha Defines the minimum number of uppercase alphabetic characters
*               in a password. The default is 0.  Range: 0 to PW_PASSLEN.
*
*       Note: If the value of minloweralpha or minupperalpha attribute is
*             greater than minalpha, then that attribute is reduce to minalpha
*             attribute. If 'minloweralpha + minupperalpha' is greater than
*             minalpha, then minupperalpha is reduce to
*             'minalpha - minloweralpha'.
*
* mindiff       Defines the minimum number of characters in the new password
*               that were not in the old password.  The default is 0.
*               Range: 0 to PW_PASSLEN. (root is exempt from mindiff)
*
* minlen        Defines the minimum length of a password.  The default is 0.
*               Range: 0 to PW_PASSLEN.
*
*   Note: PW_PASSLEN is defined in /usr/include/userpw.h. The value of
*         PW_PASSLEN is determined by the system-wide password algorithm that
*         is defined in /etc/security/login.cfg.
*
*         The minimum length of a password is determined by minlen and/or
*         'minalpha + minother', whichever is greater.  'minalpha + minother'
*         should never be greater than PW_PASSLEN.  If 'minalpha + minother'
*         is greater than PW_PASSLEN, then minother is reduced to
*         'PW_PASSLEN - minalpha'.
*
* minother      Defines the minimum number of non-alphabetic characters in a
*               password.  The default is 0.  Range: 0 to PW_PASSLEN.
*
* mindigit      Defines the minimum number of digits in a password.
*               The default is 0.  Range: 0 to PW_PASSLEN.
*
* minspecialchar Defines the minimum number of special characters in a
*               password.  The default is 0.  Range: 0 to PW_PASSLEN.
*
*       Note: If the value of mindigit or minspecialchar attribute is
*             greater than minother, then that attribute is reduce to
*             minother attribute. If 'mindigit + minspecialchar' is
*             greater than minother, then minspecialchar is reduce to
*             'minother - mindigit'.
*
* pwdchecks     Defines external password restriction methods used when
*               checking new passwords.  The format is a comma-separated list
*               of absolute path names to methods and/or method path names
*               relative to /usr/lib.  A password restriction method is a
*               program module that is loaded by the password restrictions code
*               at runtime.  All password restriction methods and directories
*               should be write protected from everyone except root.  The
*               default is valueless, which is equivalent to no external
*               password restriction methods.
*
* pwdwarntime   The number of days before a forced password change that a
*               warning will be given to the user informing them of the
*               impending password change.  Possible values: a positive integer
*               or 0 to disable this feature.
*
* registry      Describes where this user is administered.  It is used
*               whenever there is a possibility of resolving a remotely
*               administered user to the local administration domain.
*               This can happen when network services go down or
*               network databases are replicated locally.
*               Possible values : files, NIS, or DCE
*
* rlogin        Defines whether the user account can be accessed by remote
*               logins.  Commands rlogin and telnet support this attribute.
*               Possible values: true or false.
*
* su            Defines whether other users can switch to this user account.
*               Command su supports this attribute.
*               Possible values: true or false.
*
* sugroups      Defines which groups can switch to this user account.
*               Alternatively you may explicitly deny groups by preceding
*               the group name with a ! character.
*               Possible values :
*                       A list of valid groups separated by commas, ALL, or *.
*
* tpath         Defines the user's trusted path characteristics.
*               Possible values:
*                       nosak   : The Secure Attention Key (SAK) key (^X^R)
*                                 has no effect.
*                       notsh   : The SAK key logs you out.  You can never be
*                                 on the trusted path.
*                       always  : When you log in you are always on the
*                                 trusted path.
*                       on      : The trusted path is entered when the SAK
*                                 key is hit.
*
*               Note    : This attribute only takes effect if the sak_enabled
*                         attribute (in /etc/security/login.cfg) is set to
*                         true for the port you are logging into.
*
* ttys          Defines which terminals can access the user account.
*               Alternatively you may explicitly deny terminals by preceding
*               the terminal name with the ! character.
*               Possible values:
*                       List of device paths separated by commas, ALL or *.
*
* umask         Defines the default umask for the user.
*               Possible values: three-digit octal value.
*
* Notes:        Boolean values (i.e. true or false) may use any of the
*               following values.  These values are not case sensitive.
*
*                       true, false, yes, no, always, never.
*
*******************************************************************************

default:
        admin = false
        login = true
        su = true
        daemon = true
        rlogin = true
        sugroups = ALL
        admgroups =
        ttys = ALL
        auth1 = SYSTEM
        auth2 = NONE
        tpath = nosak
        umask = 022
        expires = 0
        SYSTEM = "compat"
        logintimes =
        pwdwarntime = 5
        account_locked = false
        loginretries = 0
        histexpire = 52
        histsize = 4
        minage = 4
        maxage = 13
        maxexpired = 4
        minalpha = 2
        minloweralpha = 1
        minupperalpha = 1
        minother = 1
        mindigit = 1
        minspecialchar = 1
        minlen = 10
        mindiff = 0
        maxrepeats = 8
        dictionlist =
        pwdchecks =
        default_roles =

root:
        admin = true
        SYSTEM = "compat"
        registry = files
        loginretries = 0
        account_locked = false
         minlen = 8
        histsize = 2
        maxexpired = 52
        minupperalpha = 0

daemon:
        admin = true
        expires = 0101000070

bin:
        admin = true
        expires = 0101000070

sys:
        admin = true
        expires = 0101000070

adm:
        admin = true

uucp:
        admin = true
        login = false
        rlogin = false
        su = true

guest:

nobody:
        admin = true
        expires = 0101000070

lpd:
        admin = true
        expires = 0101000070

sshd:
        admin = false
        account_locked = true
        login = false
        rlogin = false

invscout:
        admin = true

snapp:
        admin = false
        rlogin = false
        su = false
        SYSTEM = "NONE"
        login = true
        ttys = /dev/tty0
        registry = files
        dce_export = false

ipsec:
        admin = false

nuucp:
        admin = false

smmsp:
        admin = false
        su = false
        login = false
        rlogin = false

srvproxy:
        admin = false
        umask = 2
        login = false
        rlogin = false

esaadmin:
        admin = true
        login = false
        rlogin = false
        umask = 22
        registry = files
        default_roles = SysConfig

```

</details>

### <INS>$HOME配下の設定ファイル</INS>
$HOME配下の設定ファイルはユーザーの個別設定に関するファイルです。
基本的にユーザー固有のカスタマイズはこの場所のファイルに記述します。

##### $HOME/.profile
ログインシェル起動後に実行されるユーザー固有の設定を記述します。
/etc/profileで設定された環境変数などは上書きして設定します。
共用システムにおいて、あるユーザーだけの設定をしたい場合にはここで変更をかけます。

<details><summary>以下、カスタマイズした実機での出力です。</summary>

```
PATH=/usr/bin:/etc:/usr/sbin:/usr/ucb:$HOME/bin:/usr/bin/X11:/sbin:.

export PATH

if [ -s "$MAIL" ]           # This is at Shell startup.  In normal
then echo "$MAILMSG"        # operation, the Shell checks
fi                          # periodically.

# Pronpt custmize setting
PS1="[$(uname -n)@$(whoami)]\$"

export PS1

# default shell bash
exec bash

```

上記ではプロンプトをカスタマイズしてノード名とユーザー名を出力しています。
またログインシェル起動後にbashに移行しています。
</details>

##### $HOME/.kshrc
kshを起動時に適用されるユーザー固有の設定を記述します。
シェルの環境設定を記述することが多く`set -o`や`set +o`を使って記述します。
また、aliasの設定もここで実施されることが多いです。

※AIXはデフォルトがKorn shell(ksh)です。AIX7.3TL1SP1の現在はksh88 シェルがデフォルトですが将来的にフォルトの AIX シェルが ksh93 シェルに置き換えられる可能性があるそうです

:::note info
AIX7.3からbashも使用可能です。
:::

以下、bash.rteがAIX7.3にてデフォルトでインストールされるようになった模様
```
  Fileset                      Level  State      Description
  ----------------------------------------------------------------------------
Path: /usr/lib/objrepos
  bash.rte                  5.2.15.0  COMMITTED  bash shell

Path: /etc/objrepos
  bash.rte                  5.2.15.0  COMMITTED  bash shell

```

[AIX7.3リリース・ノート](https://www.ibm.com/docs/ja/aix/7.3?topic=notes-aix-73-release)より