というわけでやって参りました。新しいblog側で行う初めての連載記事です。
今回はLinuxサーバー構築ということで始めたいと思います。 他の人もこの系の話はやっていると思いますが、相変わらず書き残しておかないとどうやって構築したか忘れるんですよね・・・この手の話は自宅でサーバーを一から構築するときでもVPSで構築するときでも手順は同じですのでがんばりましょう。
一応先に参考にしたサイトを出しておきます。
サーバー構築においては設定ファイルの書き方からそれを補助するためのスクリプトまで詳しく解説しています。 このサイトに書かれていることを参考にすれば十分な動作ができるサーバーが構築できると思います。
今回はVPS系ではいつの間にか標準になっているCentOS6系をメインにMinimalのイメージを使ってインストールした後の話として構築していきます。
ちなみにVPSなどで初期設定されている場合は
対象のホスティング会社によって状態が異なりますので注意です。 特に
- rootログインは可能なのか不可能なのか(初期設定ユーザーが存在するか)
- 初期に割り当ててあるDNSはそのまま使用できるのか(使用できなければPublicDNS(GoogleのPublicDNS(8.8.8.8)など)を使う必要があり)
- ファイアウォール(iptables)はどうなっているのか
を確認しておかないと構築中にウィルスに侵入されて再構築に、という間抜けな現象になります。 スタンドアロン環境で初期構築を行う場合は余り考慮する必要はありませんが、それでもある程度進むとどうしてもパッケージをネット上から入手しないとだめなので この辺は注意が必要です。この3点は先に固めてしまいましょう。
まずはSSHで安全にログインできる環境作り
今回は上記の点に関してすべて良くない状態と仮定します。 つまり、
- ユーザーはrootのみでSSHはrootログインが可
- DNSが設定されていない、もしくはDNSが正しくないためDNSの正引きができない
- ファイアウォール(iptables)は稼働していない
とします。スタンドアロンでもこれに近い環境のことがありますので最悪の事態を避けるために即座に設定を行います。
DNS環境をセットアップ
DNSが正引きできるかどうかはpingを通してみればわかります。最小環境の場合はwgetやnslookupでさえ入っていないので・・・。 とりあえずGoogleあたりにPingをうって通るかどうか確認です。
# ping www.google.com
LANが正しくつながっていればPingが通るはずです。 これが正しく帰ってこなければ、たとえば
ping: unknown host www.google.com
と出ていたときはDNSが参照できていません。 この場合は/etc/sysconfig/network-scripts/ifcfg-eth0(Redhat系の場合。Fedoraの場合はifcfg-p11p1などになっていることがあり)をviで開いて以下の行を修正(追加)します。
DNS1="8.8.8.8"
で、ネットワークにその設定を反映させます。面倒ならこのタイミングに限り再起動させちゃっても問題はありません。
作業用ユーザーを作ってログイン環境を移動
お次はこれです。rootログインはさすがに怖いので通常ユーザーから昇格させて対応するようにしましょう。 先にsudoが入っていないとだめなのでこれが入っているか確認します。
# yum install sudo
CentOSのMinimalなら入っているはずですが・・・。
次は普通にユーザーを作成していきます。作成するユーザーをcentuserとすると
# useradd centuser # usermod -G wheel centuser # passwd centuser Changin password for user centuser. New password: Retype new password: passwd: all authentication tokens updated successfully.
としてログインできるようにします。
そしてsudoを使えるようにします。
# visudo
で、sudoの状態を変更します。
## Allows people in group wheel to run all commands #%wheel ALL=(ALL) ALL
となっている行がありますので、wheelの前の#を削除してコメントアウトを解除します。これでwhellに所属するグループはsudoを使うことができます。
最後にwheelグループ以外からのsuを禁止します。/etc/pam.d/suをviで開いて
#auth required pam_wheel.so use_uid
となっている行がありますので、authの前の#を削除してコメントアウトを解除します。 この時点でネット経由で操作しているときはいったん外部からのsshでcentuserでのログインでsudoを使えることを確認しましょう。 sudoさえ使えれば最悪
$ sudo su -
でrootとなることができるので以降はrootのパスワードやら何やらを心配する必要がなくなります。 通常管理時はむやみにrootで操作すべきではない、というのは常識ですがセットアップに限りそれは面倒すぎるので。
最後にSSHにrootでのログインを禁止させます。/etc/ssh/sshd_configを開いて
#PermitRootLogin Yes
を
PermitRootLogin No
として完了です。設定はサービスの再起動時に反映されます。面倒なら再起動でもOKです。(サービスの再起動の方法はこの下のiptablesの例を参考に)
初期ファイアウォール設定
運営するときにはアタックログなどの関係でもう少し設定が必要ですが、セットアップ時にはとりあえず設定段階のポートを見られるとまずいのでそれを封鎖します。 本来ならiptablesコマンドで追加していって・・・とやるべきでしょうが、今回はインスタントに行います。 iptablesがサービスとして動作するときに読み込むファイルを変更して対応します。ファイルは/etc/sysconfig/iptablesにあるのでこれをエディタで開いて
*filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # INPUT Main Rule -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT # SSH -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT
とします。SSHのポートだけがあいている状態で設定を行うわけですね。 これを書き込んだ上でiptablesを動作させます。
# service iptables restart # chkconfig iptables on
なお、systemctlを使う場合(Fedora系など)は
# systemctl restart iptables.service # systemctl enable iptables.service
となります。 一応この状態で再度ターミナルから先ほど作成したユーザー(centuser)でログインできるか確認してください。 できなければ設定ミスですので見直してください。ここまで終わればいったん再起動して状態を確定させましょう。 なお、ポートを開く動作については、SSHの設定行をコピーしてポート番号を変更して追記すれば簡単にできます。 たとえば、http(80)を開くなら
# SSH -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT # HTTP -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
と増やして再度iptablesを再起動すれば簡易的にはOKです。 書き込む場所はREJECT指示を書き込むまでの間になります。
環境構築用の初期設定完了
となります。この状態ならsshからログインして少しずつ構築していくことができると思います。 不正アクセスの心配もそこまではないはずですので。 後は自分が使いたい機能を増やしながらセットアップを続行します。