CentOS でサーバを設定するときの色々

自分用のサーバ設定備忘録。
基本的にほとんど全部のコマンドが、sudoかrootでの作業。なので、そんな感じで省略してます。
基本的に自分を信用しないので、細かく確認入れています。

メールサーバーについては、適当に書いているから後で設定見直し。

リポジトリの追加

 

Webサーバ、PHP、DBサーバのインストール

MySQL 5.6のインストール

yum install mysql56 mysql56-server mysql56-devel mysql56-common

Apache 2.4のインストール

yum install httpd24 mod24_ssl

PHP 5.6のインストール

yum install php56 php56-devel php56-common php56-cli php56-pdo php56-mbstring php56-gd php56-mysqlnd php-pear php56-soap php56-xml php56-xmlrpc php56-mcrypt php56-opcache php56-pecl-apcu

Webサーバ、PHP、DBサーバの起動設定

CentOS 6

起動はstart、再起動はrestart、終了はstop

service httpd start
service mysqld start

自動起動設定を有効はon、無効はoff

chkconfig httpd on
chkconfig mysqld on

自動起動確認

chkconfig --list httpd
chkconfig --list mysqld

CentOS 7

起動はstart、再起動はrestart、終了はstop

systemctl start httpd
systemctl start mysqld

自動起動を有効はenable、無効はdisable

systemctl enable httpd
systemctl enable mysqld

自動起動確認

systemctl is-enabled httpd
systemctl is-enabled mysqld

Apache

apachectlを使用すると、色々出来る。

apachectl start # 起動
apachectl stop # 終了
apachectl restart # 再起動
apachectl graceful # 再起動だがクライアントからの接続を継続しながらの再起動が必要な場合に使用
service httpd graceful # OK
systemctl graceful httpd # NG

serviceからの呼び出しでも、gracefulは使用することが可能。systemctlからの利用は不可能。

各種設定の変更

apacheに読み込まれているモジュールの確認を行う。

apachectl -M

使用したいモジュールが無い場合には、インストールや読み込みを有効化する。
読み込みを有効化する場合には、 /etc/httpd/conf.modules.d/ 配下の 00-base.conf に記載されているので、コメントアウトを外す。
それ以外の場合には、別のコンフィグファイルの中から探して有効化する。
見つからない場合には、追記して有効化する。

/etc/httpd/conf/httpd.conf

Apacheのセキュリティレベルを少しでも上げるためhttpd.confに追記

ServerTokens Prod
ServerSignature Off

バーチャルホスト用のディレクトリなどを作成しておく
ログディレクトリをシンボリックリンクでは無く、マウントを使用しているのは、FTPなどでアクセスし内容の確認を簡単に出来るようにするため

mkdir /var/www/example.com
mkdir /var/www/example.com/www
mkdir /var/www/example.com/www/htdoccs
mkdir /var/www/example.com/www/logs
mkdir /var/logs/httpd/example.com/www
chown -R apache:apache /var/www/example.com
chmod -R 775 /var/www/example
mount -bind /var/logs/httpd/example.com/www /var/www/example/www/logs

/etc/httpd/conf/vhost.conf

バーチャルホスト用のコンフィグファイルを作成して、バーチャルホスト用の設定を記載

<VirtualHost *:80>
    ServerName www.example.com
    ServerAlias example.com
    DocumentRoot /var/www/example.com/www/htdocs
    CustomLog logs/example.com/www/access_log common
    ErrorLog  logs/example.com/www/error_log
    <Directory "/var/www/example.com/www/htdocs">
        AllowOverride All
        Options +FollowSymLinks -Indexes
    </Directory>
</VirtualHost>

SSLを使用するために、秘密鍵の作成を行う。

openssl genrsa -des3 -out <秘密鍵ファイル> 2048 -sha256

パスフレーズの入力が面倒なので、複合化したファイルを作成する。

openssl rsa -in <秘密鍵ファイル> -out <複合化秘密鍵ファイル>

CSRファイルの作成。

openssl req -new -key <複合化秘密鍵ファイル> -out <CSRファイル>

認証局から証明書が発行されたら、任意の場所へ証明書と中間証明書などをアップロードする。

秘密鍵、CSRファイル、証明書のセットが正しいかどうかは、下記のコマンドの内容が一致するかで確認出来る。

openssl x509 -noout -modulus -in <SSL証明書ファイル> | openssl md5
openssl rsa -noout -modulus -in <秘密鍵ファイル> | openssl md5
openssl req -noout -modulus -in <CSRファイル> | openssl md5

Let’s Encryptでの取得

お手軽に取得出来るからLet’s EncryptでOKとしたい。

手順は後で書く。

Let’s Encrypt サーバー証明書の取得と自動更新設定メモ | あぱーブログ

Let’s Encrypt サーバー証明書の取得と自動更新設定メモ

コマンド解説 – Let’s Encrypt 総合ポータル
https://letsencrypt.jp/command/

AWS EC2 で Let’s Encrypt – Qiita
http://qiita.com/mya106/items/2e2e1c2334175891251f

Let’s Encrypt SSL証明書を自動更新する方法 AWS Nginx編 – やーまんぶろぐ

Amazon Linux 上の Let’s Encrypt で証明書更新エラーが出た時の対処方法
https://blog.yskw.info/articles/326/

yum install git # gitが必要なので、インストールされていなければインストール

cd /usr/local/
git clone https://github.com/certbot/certbot
cd certbot/

./certbot-auto --debug # AWSの場合にはdebugオプションが必要

コマンド入力後
メールアドレスの入力
ドメインの指定などが最初にできる
その後
/etc/letsencrypt/live/(FQDN)/fullchain.pem
/etc/letsencrypt/live/(FQDN)/privkey.pem
に秘密鍵や証明書ができるので、それをconfに記載

/etc/httpd/conf/ssl.conf

最近はSNI SSLで問題無いため、各VirtualDomainでSSLを使用できるように設定。

Listen 443 https
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout  300
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
SSLStrictSNIVHostCheck off

<VirtualHost *:443>
    ServerName www.example.com
    ServerAlias example.com
    DocumentRoot /var/www/example.com/www/htdocs
    CustomLog logs/example.com/www/access_log common
    ErrorLog  logs/example.com/www/error_log
    <Directory  "/var/www/example.com/www/htdocs">
        Options +FollowSymLinks -Indexes
        AllowOverride All
    </Directory>
    SSLEngine on
    SSLProtocol -ALL +TLSv1.2
    SSLHonorCipherOrder ON
    SSLCipherSuite EECDH+HIGH:EDH+HIGH:HIGH:MEDIUM:+3DES:!ADH:!RC4:!MD5:!aNULL:!eNULL:!SSLv3:!SSLv2:!LOW:!EXP:!PSK:!SRP:!DSS:!KRB5
    SSLCertificateFile      /etc/pki/tls/example.com/www/<証明書ファイル>
    SSLCertificateKeyFile   /etc/pki/tls/example.com/www/<複合化秘密鍵ファイル>
    SSLCertificateChainFile /etc/pki/tls/example.com/www/<中間証明書ファイル>
</VirtualHost>

/etc/httpd/conf/deflate.conf

GZIP圧縮転送を有効化するために、deflate.confを作成しに設定を記載

<IfModule deflate_module>
    DeflateCompressionLevel 1
    <IfModule filter_module>
         FilterDeclare Compression CONTENT_SET
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'text/html'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'text/plain'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'text/css'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'text/javascript'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'text/xml'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/xhtml'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/xml'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/xhtml+xml'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/rss+xml'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/atom+xml'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/javascript'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/vnd.ms-fontobject'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'image/svg-xml'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'image/vnd.microsoft.icon'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'font/opentype'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'font/otf'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'font/ttf'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'font/truetype'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/x-font-ttf'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/x-font-truetype'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/octet-stream'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/x-font-woff'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/x-woff'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/x-font-woff'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'image/svg+xml'"
         FilterProvider Compression DEFLATE "%{CONTENT_TYPE} = 'application/x-font-woff'"
         FilterChain Compression
         Header append Vary Accept-Encoding env=!dont-vary
    </IfModule>
</IfModule>

正しく圧縮、素早く送信、mod_deflateの設定方法 | 純規の暇人趣味ブログ
http://jyn.jp/apache-setting-deflate/

/etc/httpd/conf/php.ini

PHPでのGZIP圧縮を許可する。圧縮レベルはhttpd.confの設定を引き継がせるため、-1をセット。

zlib.output_compression = On
zlib.output_compression_level = -1

Apacheのconfファイルのチェック

apachectl configtest

MySQLのパスワードなどセキュリティの設定(MySQL起動後に実行)

mysql_secure_installation

【MySQL, 開発環境】MySQLのインストールと初期設定 – Qiita
http://qiita.com/knife0125/items/3d685f1368a654d5187d

ユーザのグループの追加

ユーザが所属するグループを追加。こっちの方が色々良い。

gpasswd -a user group

以下だと、記述したグループしか追加されないから、間違えて他のグループ名を全部飛ばすので注意。
と言うか飛ばしたから、使わないようにする。

usermod -G group1,group2 user

ちなみに設定がちゃんと変更出来たかも確認。

まず、自ユーザーの情報確認

id

グループの各情報を確認

cat /etc/group

ユーザーパーミッション類の調整

ApacheやNginx、PHP-PFMなどがファイルを作成する際などで、ファイルのパーミッションをグループ許可を与えておくことで、作業ユーザがそれぞれのグループに所属していれば、ユーザ権限でファイルを読み書き、削除出来ることで非常に楽できるので、設定しておく。
PHP-PFMの場合には、ユーザーがPHP-PFM側を設定しておかなければいけないので注意。

CentOS 6

echo "umask 002" >> /etc/sysconfig/httpd

CentOS 7

.include /lib/systemd/system/httpd.service
[Service]
UMask=002

アクセスの制御

CentOS 7を最小構成でインストールした場合でも、firewalldが有効でpublicという設定で起動している。
そのため、普通にHTTPが通過できないので、その設定を追加する。

CentOS 7

firewall-cmd --list-all
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-port={sshを移動させたポート番号とか}/tcp
firewall-cmd --reload

 メールサーバの設定

SSLの設定で、メールを受信する必要があるのと、一部サーバーからメールを送る必要があるので、PostfixとDovecotをインストールする。

yum install postfix

/etc/postfix/main.cf

myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
inet_interfaces = all
mynetworks = 10.0.0.0/16, 127.0.0.0/8 (使用しているネットワークによって変更)
home_mailbox = Maildir/
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination

saslauthdの起動

service saslauthd start
chkconfig saslauthd on

postfixの起動

alternatives --config mat
service sendmail stop
chkconfig sendmail off
yum remove sendmail
service postfix start
chkconfig postfix on

メール受信ユーザーの作成 (SSL確認用にadminというユーザーを作成)

adduser admin
passwd admin
su - admin
mkdir /home/admin/Maildir
exit
yum install dovecot

/etc/dovecot/conf.d/10-mail.conf

mail_location = maildir:~/Maildir
auth_mechanisms = plain login

Divecotの起動

service dovecot start
chkconfig dovecot on

yum-cronの設定

yumの自動更新の設定をしておき、パッチ漏れを防ぐ

yum install yum-cron

/etc/yum/yum-cron.conf

自動更新をON

apply_updates = no

セキュリティアップデートのみを行う場合

update_cmd = security

yum-cronの起動

service yum-cron start
chkconfig yum-cron on
systemctl start yum-cron
systemctl enable yum-cron

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL