あきろぐ

いろいろめもするよ🐈🐈🐈

/etc/environmentで環境変数を読み込む場合の制約について

1024bytesを超える環境変数は値が切り捨てられる

/etc/environment環境変数を設定する場合、値に入れる文字数が多いと正しく読み込まれないことがあります。具体的にいうと1024bytesを超える値を設定しようとすると切り捨てられ、ログファイルには以下のようなエラーが吐かれるようになります。

$ sudo tail -f /var/log/secure | grep pam_
Jan 17 07:23:04 ip-xxx sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Jan 17 07:23:04 ip-xxx su: pam_unix(su-l:session): session opened for user ec2-user by (uid=0)
Jan 17 07:23:16 ip-xxx CROND[30553]: pam_env(crond:setcred): non-alphanumeric key 'YwdvO1GIK7uTSudiYcUn' in /etc/environment', ignoring

sourceコマンドを用いて手動で/etc/environmentを読み込む場合は1024bytesを超える環境変数でも問題なく設定でき呼び出すことができるため、特に制約がないように見えます。

しかし、ユーザーログイン時にPAMによってユーザー認証が行われる際、pam_env.soというPAMモジュールが環境変数の初期設定のために呼びだされ、環境変数を読み込んでいますが、古いバージョンのPAMモジュールだと環境変数の長さの制約(1024bytes)があるため、この値を超える環境変数は切り捨てられてしまいます。

切り捨てられると上記のようにnon-alphanumeric keyとしてログに書き込まれるようです。

この問題についてはlinux-pamのレポジトリにIssueが上がっていました。

BUF_SIZEという変数で/etc/environmentに設定できる環境変数の長さが制限されているようです。

github.com

BUF_SIZEは以下のコミットで8192まで上限が上げられているため、PAMのバージョンが1.5.3以降であれば問題なさそうです。

github.com

PAMのバージョンは、以下のコマンドを使って確認できます。

$ rpm -qa | grep pam

回避策

v1.5.3未満のPAMが使われているLinuxの場合の回避策としては、以下2つが挙げられるかなと思います。

  1. BUF_SIZEの値を変更してPAMをリビルドする
  2. /etc/environment以外のファイルに環境変数を設定する

1に関しては、リビルドする方法がこちらに記載されています。Ubuntuを使用しているのであればこちらのリンクのスクリプトを用いることができそうです。

unix.stackexchange.com

2に関しては、私が実際に試した方法となります。

例えば、.bash_profileに長い環境変数を保存しておき、アプリケーション等で.bash_profileに記載された環境変数が読み込まれるようにしておけば、上記の問題は回避することが可能です。