ssh経由でulimitの値を変更できない
お願いされたのだがこの変更に非常に躓いたのでブログに記しておく。
まず、一番最初に試したのが
$ ulimit -n 4096
コレ。
そうすると・・・
-bash: ulimit: open files: cannot modify limit: 許可されていない操作です
こう帰ってきてしまい、なんだかうまくいかない。
ちょっとGoogle先生に聞いてみると、sshを経由するとうまくいかないみたい。
ssh でログインして ulimit コマンドを使うとエラーになる
http://d.hatena.ne.jp/yohei-a/20090310/1236706236
なるほど。確かにsshでやってる。この場合はsshdのパラメータ変えて対応するのね。
つーことでsshd_configの中身を確認してみると。
コメントになっている。なるほど、ここを書き直してulimitすりゃええのね。
[root@localhost ~]# grep UsePrivilegeSeparation /etc/ssh/sshd_config
#UsePrivilegeSeparation yes
ってことで書き直してsshdを再起動する。
[root@localhost ~]# vi /etc/ssh/sshd_config
#UseLogin no
UsePrivilegeSeparation no
#PermitUserEnvironment no
[root@localhost ~]# service sshd restart
sshd を停止中: [ OK ]
sshd を起動中: /etc/ssh/sshd_config line 103: missing yes/no argument.
[失敗]
[root@localhost ~]# vi /etc/ssh/sshd_config
[root@localhost ~]# service sshd start
sshd を起動中: [ OK ]
[root@localhost ~]#
ちょっとミスったのはご愛嬌。
これでいけんじゃね?ってことで再ログインしてもう一度試してみる。
[ram-kun@localhost ~]$ ulimit -n 4096
-bash: ulimit: open files: cannot modify limit: 許可されていない操作です
ぐお。。。。ブロックされた。まだなんか足りないのか。。。
さらにGoogle師匠に問い合わせてみると
元ネタらしきところに到達。そこに面白いことが書いてあった。
Oracle Database 10g Release 1 (10.1.0)のインストール方法(ML3.0)
https://www.miraclelinux.com/technet/faq/data/00073.html
この原因は、ssh接続時に、/etc/security/limits.confの設定は反映されないからです。sshではセキュリティ確保のため、ssh経由で接続したプロセスに対し、そのユーザーが本来持っている権限以上の変更はできません。
あ、そっか、もともとlimits.confに何も書いてねーからデフォルト値よりも上げられないのか。
それじゃー、limits.confに書こーじゃないか。
#* soft core 0
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#@student - maxlogins 4
ram-kun soft nofile 10000
ram-kun hard nofile 15000
# End of file
よーし今度こそいけんだろ。
再ログインして確認。
[ram-kun@localhost ~]$ ulimit -n
10000
キター!
[ram-kun@localhost ~]$ ulimit -n 15000
[ram-kun@localhost ~]$ ulimit -n
15000
変更もできるゥゥゥゥゥゥ!
softに指定したのがログイン時のデフォルトのファイルオープン数で
hardに指定したのがそのユーザーが指定できるファイルオープン数の限界値ってことみたい。
・・・・と、インストールしたてのフッツーのCentOSとかなら上までの説明でヨユーでいけちゃうんですが。。。
今回仕事で触ったのはインフラ屋さんにゴリゴリにチューン?されているCentOSだったみたいで、
実際にはlimits.confをいじっただけではダメだったんですよね。
んで、何が問題だったかってーと、/etc/ssh/sshd_configの
#UsePAM no
UsePAM yes
この部分。
何も触っていないと上記のようになるみたいなんですが、
どうやらセキュリティ的な何かが働いたのか、
UsePAM no
となっていました。
再掲 Oracle Database 10g Release 1 (10.1.0)のインストール方法(ML3.0)
https://www.miraclelinux.com/technet/faq/data/00073.html
この原因は、ssh接続時に、/etc/security/limits.confの設定は反映されないからです。sshではセキュリティ確保のため、ssh経由で接続したプロセスに対し、そのユーザーが本来持っている権限以上の変更はできません。
たぶん↑のような理由なんでしょうね。
ひとまず、商用環境で実稼動するようなサーバーではなかったので、
UsePAMをyesにしてsshログイン時にlimits.confの値が反映されるようにして
今回は対応を完了しました。
まとめ
1.limits.confに指定ユーザーがオープンできるファイル数の設定が必要だった。
2.sshd_configのUsePAMがyesになっている必要があった
3.sshd_configのUsePrivilegeSeparationはホントにnoにする必要があったんだろうか・・・(゚ω゚ )
ここでひとつ疑問なのがPAM認証がnoなセキュアな本番サーバーでApacheのworkerのような
大量のファイルディスクリプタを利用するアプリケーションを実行させる場合はどうやってやるんでしょうね?
rootの起動スクリプトにulimitを仕込んでおいてsuで別ユーザー実行って形にしたらうまくlimitの値は
引き継がれるのだろうか。。。まぁそのあたりは後日調査ってことで。