サーバを構築する① 〜OSインストールからSSH接続まで〜

会社のお仕事でサーバ構築を依頼されました。これまではサーバをいじるのは何か怖かったので避けてきましたが、そうも言ってられないし、身につけておいて絶対損ではないので、ちょっとがんばってトライしてみることにする。できるようになれば、RAPIROの外部頭脳も構築できるようになるかもしれない。『ガンダム00』のヴェーダみたいなもんです。そう思えばちょっとがんばれる気がするので、人間てのは不思議なものです。

以下、サーバについては完全にド素人なので、体系だった記事を書く事はまず無理です。ということで、本当に自分のメモとして記録していきます。

(3/15追記:少しだけ整理しました)

<OSの選定>

本屋さんでLinuxのサーバ構築の本を探していたらCentOSを使っているものが多かったので、少しだけCentOSについて調べてみる。

CentOSはLinuxでサーバを構築するときによく名前が挙がるディストリビューション。Red Hat Enterprise LinuxのクローンOSで、安定性に優れる。Red Hatを引き継いだものとしてFedoraがあるが、こちらは先進性を追ったOSなので、サーバ構築には向かない。

Web上のリファレンスも多そうなので、とりあえずCentOSでサーバを構築することにする。

<CentOSのインストール>

2年前に頑張って自作したPCを引っ張り出してきて、さっそくCentOSをインストール…しようと思ったら、PCが立ち上がろうしてはすぐ落ちてを繰り返してしまう。PCの中を開けてみたら、CPUのクーラーが半分外れてた。正しく付け直したら安定して動くようになった。

CentOSは最新の6.5のisoファイルを落として来て、Macのディスクユーティリティで焼き込み。買ってきた入門書に付属のCentOS 6.0のディスクではなぜかインストールに失敗したけれど、自分で焼いたディスクならちゃんといけた。

インストールのときの注意事項は、

  • 地域選択のときに、「システムクロックでUTCを使用」のチェックを外す。こうしないと、時間が9時間ずれる。
  • 今回はサーバ構築が目的なので、インストールタイプは「Basic Server」を選択

とりあえずこれだけ。細かい設定は後でやる。

<ネットワークの接続>

これでとりあえずrootでログインはできるようになるけど、インストールのときになにも細かい設定をしていないので、このままだとネットワークにも繋がらない。ということで、ネットワークの設定をする。編集するのは以下。

  • /etc/sysconfig/network … ネッワークの基本設定。以下を記述。
    • NETWORKING=yes
    • NETWORKING_IPV6=no
    • HOSTNAME=xxxx // 自分で決めたホスト名
    • GATEWAY=192.168.xxx.1 // 自分の家のルータに合わせる
  • /etc/sysconfig/network-scripts/ifcfg-eth0 … NIC の設定。以下を追記。
    • ONBOOT=yes
    • BOOTPROTO=static
    • IPADDR=192.168.xxx.xxx // 自分で決めた固定IPアドレス
    • NETMASK=255.255.255.0
    • NETWORK=192.168.xxx.0 // 自分の家のルータが構成するネットワークの指定
  • /etc/hosts … 名前解決用ファイル。以下を追記したが、書かなくてもいいかも。
    • 192.168.xxx.1 router
    • 192.168.xxx.xxx ホスト名
  • /etc/resolv.conf … 名前解決用のDNSサーバのアドレス設定。ルータのアドレスを指定。
    • nameserver 192.168.xxx.1
  • /etc/nsswitch.conf … 名前解決の順番指定。”hosts”の部分が次のようになっているか確認。
    • hosts: files dns

全部設定できたら、ネットワークの設定を有効にする。

# service network restart

これでとりあえずpingは通った。

<ユーザとグループの設定>

ユーザの追加は、

# useradd [オプション] ユーザ名

実行にはスーパユーザ権限が必要。ユーザが登録されると同時に、ユーザのホームディレクトリが作成される。オプションは基本的に指定する必要はなさそうなので、とりあえず覚えなくてOK。有効期限を設定できたりする。

useraddを実行しただけではパスワードが設定されていないので、アカウントは無効になっている。passwdコマンドでパスワードを設定すると、アカウントが有効になる。

# passwd [オプション] [ユーザ名]

スーパユーザで実行すれば、ユーザ名を指定することで、任意のユーザのパスワードを変えることができる。オプションを使えばパスワードの有効期限を設定することができる。必要に応じて設定するので、今回はパス。

次に、追加したユーザでsudoコマンドを実行できるように設定する。どのユーザも、rootになるためのパスワードさえ知っていれば、ログインした後にsuでrootになれる(ちなみに通常の”su”でrootになると、昇格前のユーザの設定が引き継がれる。”su -” でrootになると、root専用の環境になる)。ただ、これをやると、rootのパスワードを多くのユーザ共有することになったり、rootになるためにrootのパスワードを頻繁に打ち込むことになり、セキュリティ上よろしくない。ということで、root以外のアカウントでも必要に応じてroot権限でコマンドを実行できるように、sudoの設定をする。このときに打ち込むことになるパスワードはそのユーザのパスワードでOKなので、rootのパスワードがネットワーク上を流れるよりは、セキュリティ的にマシになる。つまりイメージとしては、あらかじめrootさんが「userさんは自分のパスワードさえ打ち込んでくれてたら自分(root)と同じ権限で実行してくれていいよ」という設定をしてくれているので、rootパスワードではなく自分のパスワードでOK、ということ。

sudoの設定をするときは、viではなく専用のコマンドを使って設定ファイルを編集する(実際に開くエディタは通常viになるけれど)。

# visudo

これで開くファイル(/etc/sudoers)の末尾に、以下の書式で追記する。

  • ユーザ名 コマンドを実行するホスト名=(sudoされるユーザ名) コマンド

もしくは

  • %グループ名 コマンドを実行するホスト名=(sudoされるユーザ名) コマンド

今回は、次のように記述する。

  • ユーザ名 ALL=(ALL) ALL

これで、「ユーザ名」は、sudoをつけさえすれば、どのホストで実行されるときも、すべてのコマンドに対して、すべてのユーザの権限(つまりroot権限も含む)で実行することができる。

<SSHの設定>

次にSSH(Secure SHell)の設定。これができればクライアントPCからログインできるので、いちいちCentOS用にPCの画面を切り換えなく済む(<-クライアントPCとサーバPCでディスプレイを兼用していたので)。

SSHには2種類ある。

  • SSH1 … RSA公開鍵方式
  • SSH2 … 元々はDSA公開鍵方式、現在はRSA公開鍵方式も利用可能

SSHによる通信は常にデータの改竄がないかチェックが行われるが、このチェック方式はSSH2の方がより強固な仕組みが採用されているらしいので、基本はSSH2を使用する。RSAとDSAについては、RSAの方が安全性が高いらしいので、『SSH2のRSA公開鍵方式』で環境を作る。

とりあえず、必要なパッケージがインストールされているかを確認。

# yum list installed | grep openssh

必要なもの(openssh, openssh-server, openssh-clients)は入っているよう。

次に、/etc/ssh/sshd_configを次のように編集。

  • Portのコメントアウトを外してPort番号を変更
    • ポート番号22はwell-known過ぎるので使いたくない
  • PermitRootLoginのコメントアウトを外してnoにする
    • rootでログインできると危険
  • PermitEmptyPasswordsをnoにして有効化。
    • とりあえず通常のパスワードでログインできるように

設定が終われば、

# service sshd restart

で、sshを有効にする。ただし、これだけだとPort番号の変更が有効にならない(後で確認したら接続できなかった)。変更する場合は、以下のファイルも変更が必要。

  • /etc/sysconfig/iptables
    • “-A INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT”のポード番号部分を変更
  • /etc/services
    • 直接すぐに影響するわけではないが、今後の混乱を防ぐために、sshのポート番号部分を変更

iptabesはファイアウェールの設定をしていると思えばよい。変更が終わったら、

# /etc/init.d/iptables restart

をやってから、再度sshdをrestart。これで変更後のポート番号で、パスワードでのssh接続ができるようになった。MacのターミナルやLinuxのシェルから接続する場合は、

$ ssh -p ポート番号 ユーザ名@192.168.xxx.xxx"

< セキュリティの設定>

続いて、セキュリティの設定。TCP Wrapperでホストの制限ができるらしいけれど、今回は省略して、とりあえずPAM(Pluggable Authentication Module)の設定だけする。PAMはユーザ認証を行う部分をモジュールとして切り出したもの。以下の順で設定する。

  • /etc/pam.d/sshd
    • 末尾に”account required pam_access.so”追加。これで、/etc/security/access.confが有効になり、PAMの制御が行えるようになる。
  • /etc/security/access.conf
    • 末尾に”-:ALL EXCEPT グループ名:ALL”追加。これで、グループのユーザ以外はログイン不可にする。
  • /etc/ssh/sshd_config
    • “UsePAM=yes”になっているか確認。

/etc/security/access.confに記載したssh用のグループを作っていない場合は、作成する。

# groupadd グループ名
# gpasswd -a ユーザ名 グループ名

ユーザのグループへの追加は、なぜかgpasswdという名前。なお、-dオプションでユーザの削除。

ついでに、suでrootになれるユーザも制限する。まず、rootユーザになれるユーザをwheelグループに所属させる。wheelグループはUNIX系システム上でroot特権を得ることのできるユーザーの属するグループの名称で、改めて作らずともシステムが勝手に作ってくれているよう(一応、less /etc/groupで確認。なければ作る)。

# gpasswd -a ユーザ名 wheel

あとは、PAM認証の設定のため、以下を設定する。

  • /etc/pam.d/su
    • “auth required pam_wheel.so use_uid”のコメントアウトを外す
  • /etc/login.defs
    • 末尾に”SU_WHEEL_ONLY yes”を追加

以上で設定完了。ログインユーザでrootになれることは確認。

<SSHの公開鍵暗号方式設定>

最後に、公開鍵暗号方式でSSH接続できるようにする。そのために、まずクライアント側で公開鍵と秘密鍵を作る。公開鍵はデータの暗号化だけを行う鍵で、秘密鍵はデータの復号化だけを行う鍵。自分の環境はMacなので、ターミナルから以下のコマンドで鍵を生成。

$ ssh-keygen -t rsa

これで、SSH2のRSAの公開鍵鍵暗号方式の鍵が作られる。次に、これをサーバにアップロードする。

$ scp -P 設定したポート番号 .ssh/id_rsa.pub ユーザ名@192.168.xxx.xxx:/home/ユーザ名/.

scpのときのポート指定のオプションは”-p”じゃなくて”-P”になることに注意。

次に、サーバ側で以下の操作を実施。

$ mkdir .ssh //ホームフォルダ直下に作成
$ cat id_rsa.pub &gt; /home/ユーザ名/.ssh/authorized_keys //id_ras.pubを移動させて名前を変更してもよいと思う
$ chmod 700 .ssh //そのユーザはディレクトリを自由にできるが、それ以外のユーザは見る事も触ることもできない
$ chmod 600 .ssh/authorized_keys //そのユーザのみ読み書き可能.それ以外のユーザは操作は一切不可

あとは、”/etc/ssh/sshd_config”を次のように変更

  • “PubKeyAuthentication yes”のコメントアウトを外す
  • “PasswordAuthentication”をnoに変更

設定できたら、

# service sshd restart

これで再度Macからログインができることを確認。

 

とりあえずこれでサーバの基本的な立ち上げは出来たと思うので、ここから色々入れていかなきゃいけない。ApacheとかTomcatとか。

 

ちなみに、今回のサーバ構築は、本屋さんに置いてあった以下の本を参照しながらやりました。

自分のような「Linuxは触ったことあるけれど、サーバ構築についてはド素人」の人間が、大筋「何を設定していけばいいのか」を知るには役立ちます。が、困ったことに、ちょいちょい間違いがあります。設定の一覧と本文中の説明でyesとnoが真逆だったり、コマンドで”service”とすべきところが”server”になっていたりする。よく読めばどちらが正しいかとかはわかりますが、完全なLinuxの初心者にはちょっとおススメしにくいです。あと、付録のDVDに収録されている(らしい)CentOS6.0は、ウチのPCではインストールできませんでした。