Foreverly

メモ帳

Apache2.2の設定

前回のCentOS6.7の設定続き!

久しぶりにやったので、CentOS6.9でやりました... ipもよしなにお願いします。 2017年にApache2.2で申し訳ない

Apache2.2の設定

CentOS6系の設定を想定なのでApache2.2です。(古いね)

  • 以下内容

VirtualHostの設定をしてドメインにアクセスできること 名前ベースの仮想ホストで複数のホスト名をつける SSL通信ができること

Apacheインストール

インストール

# yum install httpd
# httpd -version
Server version: Apache/2.2.15 (Unix)

自動起動の設定

# chkconfig --list |grep httpd
httpd           0:off   1:off   2:off   3:off   4:off   5:off   6:off
#  chkconfig httpd on
# chkconfig --list |grep httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off

Apache設定ファイル

全体の設定と範囲を指定した設定の2つあります。 この範囲を「セクションコンテナ」といいます。 セクションコンテナの中で設定した項目はセクションコンテナ内だけの設定になるのです。

セクションコンテナの種類

    • ファイルを示す
    • URLを示す

Apacheの設定ファイルは、行毎に「ディレクティブ」と呼ばれる設定内容を記述します。 Apache2.2と2.4では記述の仕方が違うので設定ミスに注意が必要。 2.4使うならNginxを使ったほうがいいかも。。

ディレクティブの大文字小文字の区別はされません。 優先順位はの順番で解釈され、 先に解釈された設定は、後で解釈された設定で上書きされてしまうので、 アクセス制限などには気をつける点ですね。

編集が終わったら設定ファイルの書式が間違っていないかを確認するようにしましょう。

# service httpd configtest
Syntax OK

名前ベースの仮想ホスト

リクエストヘッダ内で指定されているHost:ヘッダーの情報からアクセス先のホストを識別できる

VirtualHostの設定

設定をスッキリさせたいので、conf.d配下に vhosts.confというVirtualHost専用の設定ファイルを作りました。 VirtualHostで指定したIPアドレスに一致した場合のみ設定が適用されます。

# cat conf.d/vhosts.conf
# 仮想ホストのIPアドレスを指定(Apache2.4では不要)
NameVirtualHost *:80

<VirtualHost *:80>
ServerAdmin sysadmin@test1.jp
DocumentRoot /var/www/vhosts/www.apachetest1.jp
ServerName www.apachetest1.jp
</VirtualHost>

<VirtualHost *:80>
ServerAdmin sysadmin@test1.jp
DocumentRoot /var/www/vhosts/www.apachetest2.jp
ServerName www.apachetest2.jp
</VirtualHost>

DocumentRootも作っておくます。 index.htmlも置いておきました。

# mkdir /var/www/vhosts/www.apachetest1.jp/
# cat /var/www/vhosts/www.apachetest1.jp/index.html
apachetest1 is OK
# mkdir /var/www/vhosts/www.apachetest2.jp
# cat /var/www/vhosts/www.apachetest2.jp/index.html
apachetest2 is OK

動作確認してみましょう。 Hostヘッダーを指定してcurlコマンドを実行すると見事index.htmlの情報をとってこれました;-)

# curl -H 'Host: www.apachetest1.jp' 192.168.33.111
apachetest1
# curl -H 'Host: www.apachetest2.jp' 192.168.33.111
apachetest2

Apache再起動時に以下のメッセージが出たので、hostsに記載。localhostで名前解決させればよさそう。

[root@www ~]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: httpd: apr_sockaddr_info_get() failed for www.apachetest1.jp
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]
# vim /etc/hosts
# cat /etc/hosts
127.0.0.1   www.apachetest1.jp localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         www.apachetest1.jp localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@www ~]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

QUIZ:ブラウザでindex.htmlの中身を確認したい場合はどうすればいいでしょうか?

SSL通信

let's encryptはローカルドメインには使えんので、今回はおれおれ証明書で! 本番環境ではlet's encryptもしくはverisignやcybertrustやrapid-sslなど商用のCAを使ってください!

商用CAもCSRをCAに送って、入金して、証明書がもらえたら、よしなに設定の流れです。

SSL化する理由はなんでしょうか

  • データの改竄防止
  • データ盗聴防止
  • CA(認証局)による認証によって、本物であることを証明する

何が必要でしょうか

  • openssl
    • SSLを利用するのに必要なソフトウェア
  • mod_ssl
    • OpenSSLを使ってApacheSSLに対応させるmodule

てなわけでインストール

# yum install -y mod_ssl openssl
# httpd -M | grep ssl
Syntax OK
 ssl_module (shared)

OpenSSLコマンドで以下のファイルを用意します。 複数ドメインを持つ場合は命名規則を立てたほうがよいですね。 CommonName.作成日.ファイルタイプなど

鍵の置き場所はmod_sslをインストールしたらデフォルトはconf.d/ssl.confになると思います。 また、443ポートで受けます。

# grep SSLCert conf.d/ssl.conf
# Point SSLCertificateFile at a PEM encoded certificate.  If
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
# grep Listen conf.d/ssl.conf
Listen 443

今回はvhosts.confに設置場所を以下に指定してそこに置いてみましょう。

mkdir /etc/httpd/conf/ssl
# vim vhosts.conf
<VirtualHost *:443>
  ServerName www.apachetest1.jp
  DocumentRoot /var/www/test1
  SSLEngine on
  SSLCertificateFile /etc/httpd/conf/ssl/server.crt
  SSLCertificateKeyFile /etc/httpd/conf/ssl/server.key
</VirtualHost>

デフォルトのssl.confでSSLEngine onコメントアウトしておきましょう~~

# grep SSLEngine /etc/httpd/conf.d/ssl.conf
# SSLEngine on

上のコメントアウトをしなかったら、以下のエラーメッセージが出てApacheが起動しなくなりました..

[error] Illegal attempt to re-initialise SSL for server (theoretically shouldn't happen!)

秘密鍵の作成

# openssl genrsa -out server.key 2048

genrsa: RSA形式の秘密鍵を作成 -out 秘密鍵: 秘密鍵の名前指定 2048: 2048バイト長の鍵を作成

CSR作成

今回はwww.apachetest1.jpだけHTTPS

# openssl genrsa -out server.key 2048
Generating RSA private key, 2048 bit long modulus
.........................................+++
...+++
e is 65537 (0x10001)
[root@localhost ssl]# openssl req -new -sha256 -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Shinjuku-ku
Organization Name (eg, company) [Default Company Ltd]:Default Company Ltd
Organizational Unit Name (eg, section) []:section
Common Name (eg, your name or your server's hostname) []:www.apachetest1.jp
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

CommonNameとbit長など間違いないか確認

# openssl req -in server.csr -text
Certificate Request:
   Data:
       Version: 0 (0x0)
       Subject: C=JP, ST=Tokyo, L=Shinjuku-ku, O=Default Company Ltd, OU=Technology, CN=www.apachetest1.jp
       Subject Public Key Info:
           Public Key Algorithm: rsaEncryption
               Public-Key: (2048 bit)
               Modulus:
                   00:ca:d9:de:81:97:43:ff:21:d9:4b:7c:26:50:e1:
  • CSR作成の前に以下の項目を確認しておくといいです。
DN フィールド 説明
Country Name (2 letter code) 二文字の国名 JP
State or Province Name (full name) 都道府県 Tokyo, Tokyo-to
Locality Name (eg, city) 市区町村 Shinjuku-ku
Organization Name (eg, company) 会社名・組織名 Default Company Ltd
Organizational Unit Name(eg, section) 部署名 Technology
Common Name (eg, YOUR name) ドメイン名と同。間違えるとサイトみれなくなるので注意!!! 「http://」や「https://」は入力不要
www有りの場合 www.example.com
wwwなしの場合 example.com
サブドメインの場合 japan.example.com
サブドメイン無制限の場合 *.example.com
Email Address メールアドレス test@example.jp(値なしでも可)
A challenge password 値なし
An optional company name 値なし

証明書を作成し自己署名する

# openssl x509 -in server.csr -days 365 -req -signkey server.key -out server.crt
Signature ok
subject=/C=JP/ST=Tokyo/L=Shinjuku-ku/O=Default Company Ltd/OU=Technology/CN=www.apachetest1.jp
Getting Private key

-req: 入力ファイルがCSRファイルであることを指定 -days: 証明書の有効期限 x509: X.509形式の証明書を作成 -signkey 秘密鍵ファイル: 自己証明書作成時に使用するオプション。秘密鍵ファイルを指定

iptablesの設定を行う

iptablesがインストールされていることを確認

# which iptables
/sbin/iptables

iptablesのポリシー

以下の基本ポリシーを”DROP”(拒否)、”ACCEPT”(許可)のどちらかに設定します。

INPUT:サーバーに入ってくる通信のポリシー。基本ポリシーを”DROP”にして、あとで個別のポートに対して許可する設定にする。 OUTPUT:サーバーから出て行く通信のポリシー。基本ポリシーは”ACCEPT“にする。 FORWARD:受信したデータを他のサーバーへ転送する際に適用される設定。ここでは、特に転送するサーバーは無いので”DROP”。

現状設定されていないです。  

# iptables -nvL --line
Chain INPUT (policy ACCEPT 6332 packets, 472K bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 3243 packets, 254K bytes)
num   pkts bytes target     prot opt in     out     source               destination

以下の設定ファイルを作成していきます。 記載内容はさくらインターネットさんの記事を参照で

# vim /etc/sysconfig/iptables

設定を反映させます。

# service iptables restart
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]

22,53,80,443ポートが開放されていることが確認できました。

# iptables -nvL --line
Chain INPUT (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
2        0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:0x3F/0x00
3        0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:!0x17/0x02 state NEW
4        0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:0x3F/0x3F
5        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 8 limit: up to 1/min burst 10 mode srcip htable-expire 120000
6       11   576 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
7        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp spt:53
8        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 flags:0x17/0x02 limit: up to 1/min burst 10 mode srcip htable-expire 120000
9        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80
10       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:443

Chain FORWARD (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 6 packets, 448 bytes)
num   pkts bytes target     prot opt in     out     source               destination

コマンドなら以下ですね

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT

graceful再起動で反映

/etc/init.d/httpd graceful

https://www.apachetest1.jpにアクセスできることを確認