自宅やホスティングなどにおいてCentOSなどのLinuxを利用する人が増えてきました。
最近では格安VPSも増え、さくらインターネットのVPSなど、個人で利用できる安価でパフォーマンスの高いLinux環境が簡単に手に入るようになりました。
このようにサーバを活用する人が増えることは喜ばしい事ですが、いつの間にか乗っ取られていたり、大量のアクセスが来てダウンしてしまったり、自宅のパソコンとの違いに驚く人も多いようです。
今回は、CentOSをサーバとして利用する際に、最初にやっておきたい基本的な設定について解説をします。
さくらのVPSのデフォルトでは、多くのデーモンを停止済みにしているほか、selinuxもdisabledとなっています。
それではみていきましょう。
- まず最初にsshのポート番号を変更します。
- 次に公開鍵認証でssh接続するように変更します
- 次にiptablesを設定します。
- 次に不要なデーモンをストップします
- 要らないコンソールを無効にします
- selinuxを無効にします
ポート番号の変更は必ずしないといけない訳ではないですが、簡単にできる攻撃対策です。
インターネットでは、全世界の22番ポートをくまなく調べ、セキュリティホールのあるサーバが無いかチェックしているロボットがいます。
もちろん、どうしてもあなたのサーバを落としたい!というロボットがいたら別ですが、普通のロボットは無差別なIPアドレスへポート22固定で攻撃をしてきますから、22番ポート以外に変更することは非常に効果があります。
/etc/ssh/sshd_config
#Port 22
Port 10022
今回は10022番ポートに変更しました。
再起動されれば変更が反映されます。
sshでは公開鍵を利用してパスワードを使わずに接続することが可能です。
具体的にはクライアントでキーペア(秘密鍵と公開鍵)を生成し、サーバには公開鍵だけを登録することで達成できます。
キーペアの生成方法はクライアントによって異なりますが、teratermの場合でしたら「設定」→「SSH鍵生成」で生成できます。
もしクライアントがLinuxやFreeBSDなどでOpenSSHを利用しているのであれば、以下のようにして生成を行います。
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
・・・・
次に生成された公開鍵をサーバにセットします。
# cat >> ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEArg5hePwQQPJKWvlNFGi4TArKI2kB
e4pZNGY/KeEYp3JkmRbcFgThliRmaCVUauCYvSddenbuwF5jytP8py5JtYNaUOnEO
J4JU5298dA1Ul2rrft9B+GcEN1tYL4iJStMi4gkK1234567890/3rD+0bfEv5M6PwgRhy6
gE3LrYw+hpigyi7EChcgtv0e205fDUFcenArrjgGxz9Vw5edz7pHA9dSHLveLanrxNu0p
Ry5KYH49IdSp141TcQXm1xL/l/3erH+pnoG4taDjH3LIdC8BglZzVPbuO5jySW62ciRw
QFguH7hzp/Uily3pbsmy0EtAjIcrZ5SCUe7rXLHlfQ== tanaka@tanaka-PC
^D
#
これで公開鍵を利用したログインが可能になります。
ただ、ここで安心してはいけません。
今の状態は、公開鍵”でも”ログインできる状態なだけで、公開鍵”でしか”ログインできないわけではありません。
これを変更するには、再度sshの設定を変更します。
/etc/ssh/sshd_config
PermitRootLogin without-password
このあとでsshdを再起動すれば、rootログインは公開鍵認証でのみ行えるようになります。
なお、root以外のユーザにおいても公開鍵のみのログインにしたい場合には、以下のような設定を行います。
PasswordAuthentication no
これで、SSHログインは全てのユーザにおいてパスワード認証が無効化されました。
基本は、sshとhttp以外は通さないようにするのが吉ですし、sshについては自宅や会社、レンタルサーバなどのIPアドレスからのみ接続できるように設定したほうが良いでしょう。
以下の例では、httpのみどこからでも接続できるように設定し、sshは210.224.160.0/19からのみ、それ以外のポートは閉じる設定です。
/etc/sysconfig/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -s 210.224.160.0.0/19 -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
ここからはパフォーマンスの設定です。
CentOSデフォルトでは、びっくりするくらいのサービスが動いています。これらのほとんどはサーバに必要ないものですので、ざっくりoffにしましょう。
chkconfig acpid off
chkconfig auditd off
chkconfig autofs off
chkconfig avahi-daemon off
chkconfig bluetooth off
chkconfig cups off
chkconfig firstboot off
chkconfig gpm off
chkconfig haldaemon off
chkconfig hidd off
chkconfig isdn off
chkconfig kudzu off
chkconfig lvm2-monitor off
chkconfig mcstrans off
chkconfig mdmonitor off
chkconfig messagebus off
chkconfig netfs off
chkconfig nfslock off
chkconfig pcscd off
chkconfig portmap off
chkconfig rawdevices off
chkconfig restorecond off
chkconfig rpcgssd off
chkconfig rpcidmapd off
chkconfig smartd off
chkconfig xfs off
chkconfig yum-updatesd off
/etc/inittabを以下のようにコメントアウトしましょう。
#2:2345:respawn:/sbin/mingetty tty2
#3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6
selinuxについても、一般的なウェブサーバでは不要でしょうから、offにします。
/etc/sysconfig/selinuxのSELINUX=enforceを以下のように書き換えれば完了です。
SELINUX=disabled
selinuxがoffにすることで、幾分パフォーマンスが向上するそうです。
これで設定は完了です。
再起動を行うことで、全ての設定変更が反映されます。
sshdのポートが変わっていますから、あせらず新しいポートへ接続してみてください。
さて今回、後半に解説したパフォーマンス改善は意外と見落としがちのことです。
今回は512MB搭載した64ビットの仮想環境(VPSでは無い)で実験しましたが、起動時間、空きメモリ共に大きな改善が見られました。
起動時間はチューンナップ前が61秒だったのに対し、チューンナップ後は41秒と3割以上も短縮されました。
メモリの使用量についても、チューンナップ前が219MBだったのが144MBにやはり3割以上も削減されました。
変更前のfree結果
[root@localhost ~]# free
total used free shared buffers cached
Mem: 510008 219440 290568 0 12284 126340
-/+ buffers/cache: 80816 429192
Swap: 1048568 0 1048568
変更後のfree結果
[root@localhost ~]# free
total used free shared buffers cached
Mem: 510008 144544 365464 0 10220 109736
-/+ buffers/cache: 24588 485420
Swap: 1048568 0 1048568
最近では自宅サーバの搭載メモリも増えましたし、さくらのVPSやSaaSesなどスワップが利用できるVPSも増えてきましたので、以前ほどはメモリ不足に悩まされる機会も減りました。
しかし、古いマシンを活用する場合や、OpenVZ系VPSのServersman@VPSなどスワップが利用できないサービスの場合には、メモリ不足に悩まされる方も多いと聞きます。
このようなときに、上記のようなチューンナップを行うことによって、エラーに悩まされることなく利用できるようになるでしょう。
なお、CentOSの場合にはインストール時にDesktopとかServerとか選択せず、X-Window Systemも入れるべきではありません。
また、64bitのOSは高速ですがメモリを多く消費するので、メモリの少ない環境(2GB以下)の場合には32bit版の活用も検討すると良いと思います。
最後になりますが、改めてパフォーマンスと併せてセキュリティに関心を持ってもらえればと思います。
以前友達のパソコンにLinuxをインストールしていた時のこと、アップデートをしている間に裏でクラックされていたなんて笑えない話もありました。
最近のパッケージはそれなりに初期状態からしっかりしていますが、周りの人に迷惑をかけないためにも、きっちりとサーバ管理を行われることをお願いします。
CentOSで標準で稼働しているサービス一覧
コマンド名 | 標準 | 設定後 | 解説 |
---|---|---|---|
NetworkManager | × | - | ネットワークの自動設定を行う |
acpid | ○ | × | 電源管理(offにすると電源ボタンでシャットダウンできなくなる) |
anacron | ○ | ○ | cronの補助的な役割を持つ |
atd | ○ | ○ | atコマンドで登録されたタスクを管理する |
auditd | ○ | × | システム監査結果のログ保存などを行う |
autofs | ○ | × | ファイルシステムの自動マウントを行う |
avahi-daemon | ○ | × | LAN内でのネットワーク自動構成を行う |
avahi-dnsconfd | × | - | 同上 |
bluetooth | ○ | × | bluetoothに対応させる |
capi | × | - | |
conman | × | - | 複数コンソールを管理する |
cpuspeed | ○ | ○ | 省電力の為のCPU速度管理を行う |
crond | ○ | ○ | cron |
cups | ○ | × | 印刷の管理を行う |
dnsmasq | × | - | DNSキャッシュサーバ |
dund | × | - | bluetoothを使ってダイアルアップを行う |
firstboot | ○ | × | インストール直後に呼び出される(その後は/etc/sysconfig/firstbootを作成し、意味のないサービスになる) |
gpm | ○ | × | コンソールマウス機能 |
haldaemon | ○ | × | D-BUSサポートを行う |
hidd | ○ | × | bluetoothのキーボードやマウスを対応させる |
httpd | ○ | ○ | |
ip6tables | ○ | ○ | |
iptables | ○ | ○ | |
irda | × | - | 赤外線通信 |
irqbalance | ○ | ○ | マルチCPU時の割り込み管理を行う(シングルCPUの場合は不要) |
isdn | ○ | × | ISDN用のサービス。ただし海外向け |
kudzu | ○ | × | ハードウェアの構成変更を検知する |
lvm2-monitor | ○ | × | LVMの障害監視を行う |
mcstrans | ○ | × | SELinuxの運用サポート |
mdmonitor | ○ | × | mdデバイスの監視を行う |
mdmpd | × | - | mdデバイスを複数インターフェースで利用する際の管理を行う |
messagebus | ○ | × | D-BUSサポートを行う |
microcode_ctl | ○ | ○ | インテル系CPUのマイクロコードの更新を行う |
multipathd | × | - | DeviceMapperの管理を行う |
netconsole | × | - | カーネルエラー発生時に、その内容を他のホストへ送信する |
netfs | ○ | × | NFSクライアント |
netplugd | × | - | DHCPの補助 |
network | ○ | ○ | ネットワーク。必ず有効にする |
nfs | × | - | NFSサーバ |
nfslock | ○ | × | NFSロック |
nscd | × | - | DNSキャッシュサーバ |
oddjobd | × | - | D-BUSサポートを行う |
pand | × | - | bluetoothのネットワーク対応を行う |
pcscd | ○ | × | スマートカードの管理 |
portmap | ○ | × | RPCのポートマッパー |
psacct | × | - | アカウンティングを行う |
rawdevices | ○ | × | ハードディスクをブロックデバイスとして利用する際の補助 |
rdisc | × | - | 経路監視 |
readahead_early | ○ | ○ | 起動を速くする |
readahead_later | × | - | |
restorecond | ○ | × | SELinuxの運用サポート |
rpcgssd | ○ | × | RPCサポート |
rpcidmapd | ○ | × | RPCサポート |
rpcsvcgssd | × | - | RPCサポート |
saslauthd | × | - | SASL認証のサポート |
sendmail | ○ | ○ | |
smartd | ○ | × | S.M.A.R.Tのサポート |
sshd | ○ | ○ | |
syslog | ○ | ○ | |
tcsd | × | - | TCGのサポート |
wpa_supplicant | × | - | 無線LANにおけるWPAをサポート |
xfs | ○ | × | X-Window System用のフォントサーバ |
ypbind | × | - | NISクライアント |
yum-updatesd | ○ | × | CentOSの自動アップデートを行う |
2010/9/10追記
twitter:@tetsuro_n さんからの指摘もあり、ssh公開鍵認証の説明を追加しました。