setrlimit(2), getrlimit(2) メモ。

コマンドラインから ulimit -n 1024 などとせず、プログラム上から設定するやつ。
limits.conf 以上の値を割り当てようとすると失敗するぽい。

サンプルソース

#include <stdio.h>
#include <sys/time.h>
#include <sys/resource.h>
 
#ifndef RLIM_INFINITY
#define RLIM_INFINITY ((unsigned int)0xffffffff)
#endif
 
int main()
{
	struct rlimit rl;
	rl.rlim_cur = 0; /* ソフトリミット */
	rl.rlim_max = 0; /* ハードリミット */
 
	/* 現在設定されている値を取得する */
	if( getrlimit( RLIMIT_NOFILE, &rl ) ){
		puts( "getrlimit error." );
		return 0;
	}
	printf( "before open_files:%d\n", rl.rlim_cur );
 
	/* 制限なし状態かチェック */
	if( rl.rlim_cur == RLIM_INFINITY ){
		printf( "infinity:%d\n", rl.rlim_cur );
	}
 
	/* 試しに新しい値をセットしてみる */
	rl.rlim_cur = 512;
	/*rl.rlim_cur = 2048;*/
	if( setrlimit( RLIMIT_NOFILE, &rl ) ){
		puts( "setrlimit error." );
		return 0;
	}
 
	/* さっき設定した値を取得する */
	rl.rlim_cur = 0;
	getrlimit( RLIMIT_NOFILE, &rl );
	printf( "after open_files:%d\n", rl.rlim_cur );
	return 0;
}

他にもスタックだったりcoreファイルサイズだったり色々変更できる。
詳しくは Manpage of GETRLIMIT で。

あんまし使わないけど知ってると便利っすなー。

6月 052009
 

最小構成の vim-minimal しか入っていなかったので追加インストールしたメモ。

# rpm -qa | grep vim
vim-minimal-7.0.109-4.el5_2.4z
# yum search vim
...
vim-X11.i386 : VIM バージョンの X Window System 用 vi エディタ
vim-common.i386 : すべてのバージョンの VIM エディタで必要とされる共通ファイル
vim-enhanced.i386 : 最新の拡張機能を持つバージョンの VIM エディタ
vim-minimal.i386 : 最小バージョンの VIM エディタ
# yum -y install vim-common vim-enhanced
...
Installed
# vi ~/.bashrc
alias vi='vim'
# source ~/.bashrc
2月 212009
 

自宅 Linux さんのセキュリティ設定メモ。

SSH 編。
公開, 秘密鍵をつくってパスワードによるログインを止める。
SSH ブルートフォースアタック対策の一環。
参考:総当たり攻撃

環境:
サーバ CentOS 5.2 ( IP 192.168.11.30 )
クライアント iMac 10.5.6

クライアント:鍵を作成。

$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/Users/name/.ssh/id_dsa): /Users/name/.ssh/linux_dsa 
Enter passphrase (empty for no passphrase): ちゃんと入力する。
Enter same passphrase again: もちろんここも。

クライアント:公開鍵と秘密鍵が作られたことを確認。

$ cd ~/.ssh
$ ls
linux_dsa linux_dsa.pub

クライアント:SSH 時に認証される秘密鍵のありかを設定。

$ cd ~/.ssh
$ vi config
Host 192.168.11.30
IdentityFile ~/.ssh/linux_dsa

クライアント:公開鍵をサーバにコピー

$ scp linux_dsa.pub 192.168.11.30:

サーバー:ログインして、認証ファイルを作る

$ ssh 192.168.11.30   # サーバにログイン
$ mkdir .ssh
$ cat linux_dsa.pub >> .ssh/authorized_keys
$ rm linux_dsa.pub
$ chmod 600 .ssh/authorized_keys
$ chmod 700 .ssh

サーバー:root になって、SSH の設定を変更

$ su -
# vi /etc/ssh/sshd_config
PermitRootLogin no  # ルートでログインさせない。
PasswordAuthentication no  # パスワードでログインさせない(鍵認証のみ)
PermitEmptyPasswords no  # 空パスワードを許さない
 
# /etc/init.d/sshd reload
sshd を再読み込み中:                                       [  OK  ]

サーバー:ローカルPCからのみ SSH 接続を許可

# vi /etc/hosts.allow
sshd: 127.0.0.1  # ループバックを許可
sshd: 192.168.11.  # ローカルPCを許可
 
# vi /etc/hosts.deny 
sshd: ALL  # 基本全員を無許可

クライアント:SSH 接続を試す

$ ssh 192.168.11.30

接続できたら成功なり。

参考:SSHサーバー構築

 

TCP SYN flood 攻撃対策についてメモ。

SYN flood攻撃とは、TCP接続:3ウェイ・ハンドシェイクの仕組みを悪用し、サーバーのメモリ領域を飽和させダウンさせる仕組みらしい。

3ウェイ・ハンドシェイクの以下の部分。

・サーバーは、クライアントから SYN パケットを受け取った際、クライアントの情報を記憶するメモリを確保する。
・サーバーは、クライアントに ACK パケットを返した後、数十秒間クライアントの ACK 応答を待つ必要がある。

ここを悪用しているみたい。つまるところ。

クライアントが、サーバーからの ACK パケット を無視し、かつ短時間に大量に SYN パケット送信を行うと、
サーバーは、クライアントの情報をメモリに確保し続け、最終的に使用できるメモリがなくなる。

その結果、正常に繋ごうとする人が繋げなくなり、ダウンしたように見える。(システムによってはクラッシュまで)

対策として、SYN cookies といった手法がある。

簡単に把握した感じでは、クライアントからの SYN パケット時にメモリを確保せずにシーケンス番号を送り、
クライアントから帰ってきた ACK パケットを元にシーケンス番号の照合を行い、メモリを確保する。

ただしこの対策は、通常時に行われると弊害が多いので、SYN flood 状態時のみ行われる。

なるほどー。

設定的には、

# sysctl -w net.ipv4.tcp_syncookies=1
net.ipv4.tcp_syncookies = 1

とすれば良いみたい。

 

セキュリティ設定を行ったメモ。

以下の参考サイトを見ながら行って、特につまづくことなく終了した。

ファイル改竄検知システム導入(Tripwire)

rootkit検知ツール導入(chkrootkit)

アンチウィルスソフト導入(Clam AntiVirus)

こういった構築メモは、本当にありがたいっす。

とりあえず今日はここまで。

Linuxはシャットダウンして、YouTube にある内村さま〜ずの続きを見よう。

個人的にバナナマンの回が好き。Podcastを聞いてからけっこうバナナマンのファン。

設楽さんの仕切りは絶品っすねー。

いやー話がそれた。

明日は、iptables の設定をする。

 

Postfix インストール& OP25B 設定メモ。

今回は簡単に yum で。

# yum -y install postfix
...
Installed: postfix.i386 2:2.3.3-2.1.el5_2
Complete!

インストール完了。

デフォルト MTA を変更。

# alternatives --config mta
 
2 プログラムがあり 'mta' を提供します。
 
  選択       コマンド
-----------------------------------------------
*+ 1           /usr/sbin/sendmail.sendmail
   2           /usr/sbin/sendmail.postfix
 
Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2

これでデフォルトPostfix になった。

続いて OP25B 回避する為の設定。

so-net SMTP サーバをリレーホストに設定。

# vi /etc/postfix/main.cf
relayhost = [mail.so-net.ne.jp]:587   # 309行目に追加

so-net SMTP サーバの認証方式を確認する。

# telnet mail.so-net.ne.jp 587
Trying 202.238.82.20...
Connected to mail.so-net.ne.jp (202.238.82.20).
Escape character is '^]'.
220 mx62.ms.so-net.ne.jp ESMTP
ehlo localhost   # ←入力。
250-mx62.ms.so-net.ne.jp Hello *****.so-net.ne.jp [*****], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE 10240000
250-DSN
250-AUTH LOGIN PLAIN     # ←これ。PLAINらしい。
250-STARTTLS
250-DELIVERBY
250 HELP

確認した内容を元に Postfix 設定。以下、最後の行に追加。

# vi /etc/postfix/main.cf
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/authinfo
smtp_sasl_security_options = noanonymous
smtp_sasl_mechanism_filter = PLAIN

認証ファイルを作成する。

# echo [mail.so-net.ne.jp]:587 ***@***.so-net.ne.jp:password > /etc/postfix/authinfo
# chmod 640 /etc/postfix/authinfo
# postmap /etc/postfix/authinfo

Postfix を起動する。

# /etc/init.d/postfix start
postfix を起動中:                                          [  OK  ]

試しに送信。

# echo test | mail ***@gmail.com

受信できた!

参考:OP25B(Outbound Port 25 Blocking)対策

 

メール関連でごたついたついでにMTA(Mail Transfer Agent)のオススメを調べてみた。

古い記事だけど、「Linuxのメール・サーバー・ソフトはどれがいい?」が参考になった。

なるほどー。Postfix が良い感じってことか。

うちの centos さんは、

# alternatives --display mta
mta -ステータスは自動です。
リンクは現在 /usr/sbin/sendmail.sendmail を指しています
...

ってなってるから、sendmail を使ってるっぽい。

てか、むしろ

# rpm -q postfix
パッケージ postfix はインストールされていません。

インストールすらしてなかった模様。

まずインストールから始めますかねー。

 

いまは使ってない DELL DIMENSION 8300 を Linux 機にして復活させよう計画。

root に送られてくるメールを Gmail に転送する設定でつまづいたのでメモ。

テストメール送っても一向に届かないのでなんでだろーと調べたところ、

Outbound Port25 BlockingというISPによる迷惑メール対策に引っかかっていたのが原因だった。

うちは So-net に加入しているのだけど、ちゃんとサポートページにも載ってた。

なるほどー。

 

下書き状態で放置してた系のものをアップップ。

Munin

http://munin.projects.linpro.no/

必須Perl

http://search.cpan.org/~rhandom/Net-Server
http://search.cpan.org/~samtregar/HTML-Template/

インストール

$ sudo make install-main

Cron設定

$ crontab -e
*/5 * * * * user /path/to/munin/opt/munin/bin/munin-cron

Client 開始

$ sudo munin-node &

シンタックスエラー解決策

Parse error: syntax error, unexpected T_STRING in /path/to/index.html
$ vi php.ini
	short_open_tag = Off

plugin 作成

http://blog.enjoitech.jp/detail.php?aid=85

 

Apache に SSH パスワードなし認証をさせるメモ。

特定のユーザでリモート先のスクリプトなどをWEBから操作したいとき便利。

前提として Apache が /usr/local/apache にインストールと、sudo の設定がされてる。

専用のApacheユーザを作成する。すでに存在する場合は、飛ばす。

$ groupadd apache
$ useradd -g apache -d /home/apache -s /sbin/nologin apache

httpd.conf を編集し、UserとGroupを書き換える。

$ cd /usr/local/apache/conf
$ sudo vi httpd.conf
User apache
Group apache

パスワード無しSSHを行うための準備をする。

$ cd /home/apache
$ sudo -u apache ssh-keygen -t dsa -N ” -q
$ sudo scp ./ssh/id_dsa.pub user@host:
$ ssh user@host ‘cat id_dsa.pub >> .ssh/authorized_keys’
$ sudo -u apache ssh user@host
yes

Apache を起動。

$ cd /usr/local/apache/bin
$ sudo ./apachectl start

実験用のスクリプトを書く。(今回は、PHPで実験)

$ cd /usr/local/apache/htdocs
$ sudo vi index.php
<?php
system( “ssh user@host ‘ls’” );
?>

書いたスクリプトにアクセスして、リモート先の ls 結果が表示されれば成功。