Hatena::ブログ(Diary)

憂鬱なプログラマの形而上学 RSSフィード

2011-04-13

さくらインターネットのVPSを借りてみたので設定をメモする

さくらインターネットVPSプランを借りてみた。いくらVPSとはいえ、980円/月で管理者権限があるのは魅力的。

とりあえずVPSプランのサーバーを借りたらやっておきたい設定をまとめてみる(さくらに限らないことばかりだが、、)

とりあえずユーザー設定

まずはじめにroot権限が与えられるので、通常で利用する一般ユーザーを作成する。rootについては、SSH経由でログインできないようにするなど、権限を制限する。

# passwd 
# useradd "ユーザー名"
# passwd "ユーザー名"
# yum list installed | grep sudo
sudo.x86_64   1.7.2p1-10.el5      installed
  • 一般ユーザーをwheelに追加し、wheelグループに余計なユーザーがいないことを確認する。
# usermod -G wheel "ユーザー名"
# id "ユーザー名" 
# cat /etc/group | grep wheel 
  • wheel以外はsuできないようにする。
# vi /etc/login.defs
SU_WHEEL_ONLY yes

# vi /etc/ssh/sshd_config
auth            required        pam_wheel.so use_uid

# visudo
%wheel  ALL=(ALL)       ALL
# vi /home/username/.bash_profile
PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin
# shutdown -r now

SSHの設定

SSHについては、デフォルトの状態から以下の変更を行う

$ mkdir ~/.ssh
$ ssh-keygen -t rsa

$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

# ※後で必要になるので、先にローカルにダウンロードしてから削除すること
$ rm -f ~/.ssh/id_rsa ~/.ssh/id_rsa.pub

私の場合はSSHPuTTYを使っているが、その場合、上記の秘密鍵からPuTTY用の秘密鍵を生成する必要がある。

参考)http://vine.1-max.net/PuTTY.html

  • sshd_configの以下の設定を変更し、sshdをrestartします。
# vi /etc/ssh/sshd_config
Port 10022
PermitRootLogin no
PasswordAuthentication no

# service sshd restart 
  • 固定IPの場合のみ)自宅IP以外からのSSHの接続を拒否します。
# vi /etc/hosts.allow
sshd : 自宅IP

# vi /etc/hosts.deny
sshd : all

※ちなみにこの設定を間違えたまま開いているターミナルを閉じてしまうと、誰もログインできなくなる可能性があるため、必ず別のウィンドウで接続できることを確認する。

ファイアウォールの設定

不要な接続は拒否する。今回はMySQLTCPではなくlocalhost接続なので、不要なので、SSHHTTPで使うポートのみ許可すればよい。

  • まずは現状を確認する。(何も設定されていない。)
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
  • iptablesファイルを直接編集する。他にも許可するポートがある場合は、最後のほうで--dport 80となっている行をコピペしてその部分を許可したいポートにすればよい
# vi /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 10022 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

COMMIT
  • iptablesデーモン再起動し、指定したポートが許可されていることを確認する。この時に念のため、別のウィンドウでSSH接続できることを確認する。
# service iptables restart
# service iptables restart
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
RH-Firewall-1-INPUT  all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
RH-Firewall-1-INPUT  all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain RH-Firewall-1-INPUT (2 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     icmp --  anywhere             anywhere            icmp any
ACCEPT     esp  --  anywhere             anywhere
ACCEPT     ah   --  anywhere             anywhere
ACCEPT     udp  --  anywhere             224.0.0.251         udp dpt:mdns
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ipp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ipp
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:10022
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

dpt:http、dpt:10022という表示があれば正常。

必要なモジュールインストール

何が必要かは人によると思いますが、必要なものを落としてくる。ただし、yum -y updateは必ず行う。(yumリポジトリは今回、変更していないが必要に応じて変更するかも知れない)

# yum -y install vim-enhanced
# yum -y install subversion

# yum -y install sysstat

# yum -y install php php-devel php-gd  php-mbstring  php-pear  php-mysql php-pdo

# yum -y install postfix
# yum -y install mysql-server mytop

# yum -y install httpd httpd-devel

# yum -y update

MySQL 関連

アプリケーション関連のデータは大体ここに入るので、慎重に設定する。本当はMySQLサーバーを独立してLAN側に配置するのがいいが、ここではもろもろの事情でWEBサーバーと共有している。

  • my.cnfのチューニングは後で行うとして、とりあえずポート番号を変える。
# cp /etc/my.cnf /etc/my.cnf.bk.YYYYMMDD
[mysqld]
port = 13307
  • mysqldを起動し、一般ユーザーを作成し、権限/パスワードの調整を行う。
# service mysqld start
# mysql -u root mysql

#=== 一般ユーザー作成
mysql> grant all privileges on *.* to 'ユーザー名'@'localhost' identified by 'パスワード';

#=== なぜかデフォで存在する名前のないユーザーの削除
mysql> delete from user where user = '';

#=== 127.0.0.1/localhost/自サーバーホスト、その他外部から接続させる場合、それ以外の設定がないことを確認する。
mysql> select * from user;

#=== パスワードのないすべてのユーザーで実行
mysql> SET PASSWORD FOR root@localhost = PASSWORD('パスワード');

#=== 権限のFLUSH
mysql> flush privileges;
# chkconfig mysqld on

PHP関連

ここではとりあえずセキュリティ関連の設定と、APCインストールのみを行う。

  • php.iniの以下の設定を変更する。より細かい設定はPHPスクリプト側で変更しているのでこれだけだが、この辺りは定石だと思う。
# cp -p /etc/php.ini /etc/php.ini.bk.20110411
# vi /etc/php.ini
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8

open_basedir = /var/www # スクリプトにセキュリティホールがある場合に余計なファイルを更新させない
expose_php = Off
display_errors = Off
magic_quotes_gpc = Off
file_uploads = Off # ファイルアップロードが不要な場合のみ
# yum install pcre-devel
# pecl install APC
# vi /etc/php.ini
extension=apc.so

httpd 関連

ここもセキュリティ関連に絞って記述する。

  • httpd.confをいくつか編集する。
# vi /etc/httpd/conf/httpd.conf

#=== HTTPヘッダには必要最低限の情報のみ
ServerTokens Prod
ServerSignature Off

#=== /var/www/icons 以下のアクセスを拒否
<Directory "/var/www/icons">
    Options MultiViews
    AllowOverride None
    # Order allow,deny
    # Allow from all
    Order deny,allow
    Deny from all
</Directory>

#=== 実装の関係でいろいろ不都合なので、デフォルトのヘッダをコメントアウト
#=== AddDefaultCharset UTF-8

#=== ネームベースのVirtualHostを利用する
NameVirtualHost *:80
  • VirtualHostの設定を conf.d以下にドメインごとに作成
# vi /etc/httpd/conf.d/XXXX.XXXX.jp.conf
<VirtualHost *:80>
  ServerName XXXX.XXXX.jp
  DocumentRoot "/var/www/XXXX.XXXX.jp"
  AddDefaultCharset Off
  CustomLog "|exec /usr/sbin/rotatelogs /var/log/httpd/XXXX.XXXX.jp.access_log.%Y%m%d 86400 540" combined
  ErrorLog  "|exec /usr/sbin/rotatelogs /var/log/httpd/XXXX.XXXX.jp.error_log.%Y%m%d 86400 540"

  <Directory /var/www/XXXX.XXXX.jp>
    AllowOverride All
    Options -Indexes
  </Directory>
  <Directory ~ "\.svn">
    Order allow,deny
    deny from all
  </Directory>
</VirtualHost>
mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.nouse.YYYYMMDD
service httpd start 
chkconfig httpd on

ここまでやったら

後は使いながら適宜、必要に応じて設定を変えたりする。

例えば空メールの受信が必要ならpostfixインストールして25番ポートを空ける、などなど。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/k_yamamot/20110413/1302621230