読者です 読者をやめる 読者になる 読者になる

LAMP環境作り直してみるための備忘録

最近環境構築自宅ではdocker-composeとかに頼ってばかりだったのと
CentOSの7系を触ったことなかったのもあって
VPSで初期化して1から構築してみました。

必要なパッケージのインストール

$ yum install ***

※確認が必要ない場合は -y を付ける


■パッケージをまとめてインストール

開発ツールパッケージ群の一括インストール

$ yum -y groupinstall base Development tools

パッケージのアップデート

$ yum update
$ yum upgrade

SELINUXを無効化

$ vi /etc/selinux/config
SELINUX=enforcing

$ vi /etc/selinux/config
SELINUX=disabled

※起動時にkarnel panic が発生する場合は/etc/selinux/configにて記述ミスの可能性があるため注意

再起動

$ reboot

ネットワーク疎通の確認

$ ping 8.8.8.8

パッケージの自動更新設定を行う場合

// yum-cronのインストール
$ yum install yum-cron

// 自動更新の起動
$ /etc/rc.d/init.d/yum-cron start

// 常駐化
$ chkconfig yum-cron on

※ cron にて yum -y update と reboot を定期的に実行してもOK
しかし、yum-cronは自動でパッケージのアップデートを行うが、
アップデートされたことで不具合が発生する可能性もあるため注意。

sendmailのrootメールアドレスを変更する

$ sed -i '/^root:/d' /etc/aliases
$ echo "root: saiko_yarou@hotmail.com" >> /etc/aliases
$ newaliases

※ /etc/aliases を直接 vi で編集しても可
テストメールを送信

$ echo test|mail root

不要に開いているポートの確認

$ ss -aen

※対象ポートに対して不要なサービスを確認

$ systemctl disable abrt-ccpp 各スクリプトエラーを監視しログに出力するデーモン
$ systemctl disable abrt-oops 各スクリプトエラーを監視しログに出力するデーモン
$ systemctl disable abrt-vmcore  kernel panic 監視デーモン
$ systemctl disable abrt-xorg   自動バグ報告ツール
$ systemctl disable abrtd    各スクリプトエラーを監視しログに出力するデーモン
$ systemctl disable atd             単発スケジューラ
$ systemctl disable auditd        システム監視デーモン
$ systemctl disable avahi-daemon Apple 方式自動デバイス検出デーモン
$ systemctl disable kdump       強制再起動時のメモリ内をストレージに記録する
$ systemctl disable mdmonitor RAID管理デーモン
$ systemctl disable dmraid-activation  RAIDサポートサービス
$ systemctl disable acpid          省電力休止サポート
$ systemctl disable blk-availability  LVM2のミラーデバイス
$ systemctl disable cpuspeed    CPUアイドル時に動作周波数を上下させる
$ systemctl disable haldaemon  D-BUSサポート
$ systemctl disable messagebus D-BUSサポート
$ systemctl disable netconsole   kernel panic 時にネットワーク上にダンプする
$ systemctl disable psacct          コマンドによる負荷統計デーモン
$ systemctl disable quota_nld    ストレージ使用量制限を D-BUS に通知する
$ systemctl disable rdisc            CentOS をルータとして動作させる経路管理
$ systemctl disable rngd             乱数発生デーモン
$ systemctl disable restorecond  SELinux サポートデーモン
$ systemctl disable saslauthd      SASL認証デーモン
$ systemctl disable udev-post     ハードウエアの自動認識デーモン あってもいいかも
$ systemctl disable cpus              プリンタデーモン
$ systemctl disable bluetooth      青歯
$ systemctl disable ip6tables       ipv6パケットフィルタ
$ systemctl disable dnsmasq       DHCPサーバと連携したDNSキャッシュサーバ
$ systemctl disable firstboot        初回以外動かないサービス ほっといてもいいかも
$ systemctl disable irpbalance     マルチCP処理分散デーモン
$ systemctl disable nfs                NFSデーモン
$ systemctl disable netfs              NFSクライアントデーモン
$ systemctl disable nfslock          NFSファイルロックサービス
$ systemctl disable nmb              Samba 名前解決デーモン
$ systemctl disable squid             Proxyサーバ
$ systemctl disable sssd               LDAP認証サービス
$ systemctl disable ypbind          NISサーバ

sshftp のアクセス制限で

$ vi /etc/hosts.deny
//以下の記述を追加
sshd: ALL
vsftpd: ALL
$ vi /etc/hosts.allow
sshd: ***.***.***.***
vsftpd: ***.***.***.***

リポジトリを追加登録(epel など)を行い、enabled=0 にしている場合、別途updateする

$ yum --enablerepo=epel update

SSHにrootで直接ログインできないようにする

管理者ユーザアカウントの作成

$ useradd sunecosuri
$ passwd sunecosuri

管理者ユーザアカウントを wheel グループに追加

$ usermod -G wheel sunecosuri

root 権限に昇格できるユーザグループを wheel のみに設定する

$ vi /etc/pam.d/su
#auth required pam_wheel.so use_uid

$ vi /etc/pam.d/su
auth required pam_wheel.so use_uid

セキュリティを高めるため以下を変更

$ vi /etc/ssh/sshd_config
//対象箇所
#PermitRootLogin yes
#Protocol 2
#Port 22

//rootから直接ログインできないようにする
PermitRootLogin no
//SSH2以外のプロトコルは許可しない
Protocol 2
//ポートの変更
Port 10022

サービス再起動

systemctl restart sshd

※サービスの再起動をしたら、現在のSSH接続をそのまま継続させ、別セッションでログインテストを行う。
失敗した場合、SSH接続ができないため元の設定に戻してサービスを再起動する

DNSの設定

$ vi /etc/resolv.conf

※必要に応じてDNSの変更を行う

firewalldの設定を確認

$ firewall-cmd --list-all-zones
$ firewall-cmd --add-service=http --zone=public --permanent

※初期値ではpublicがsshのみ有効になっているため、httpを許可

例として8080と10022ポートの設定

$ firewall-cmd --add-port=10022/tcp --zone=dmz --permanent
$ firewall-cmd --add-port=8080/tcp --zone=public --permanent

設定ファイルを再読み込み

$ firewall-cmd --reload

Apache構築

$ vi /etc/httpd/conf/httpd.conf
// エラーページ等でOS名を表示しないようにする(無い場合もある)
ServerTokens OS
↓
ServerTokens Prod

// CGI/SSI の許可
Options Indexes FollowSymLinks
↓
Options Includes ExecCGI FollowSymLinks

// .htaccess の許可
AllowOverride None
↓
AllowOverride All

// 414エラーはログに記録しない
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
↓
LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

// worm、内部アクセス、自ホストからのアクセスをログに記録しない
// 以下の記述を追加追加
SetEnvIf Request_URI "default\.ida" no_log
SetEnvIf Request_URI "cmd\.exe" no_log
SetEnvIf Request_URI "root\.exe" no_log
SetEnvIf Request_URI "Admin\.dll" no_log
SetEnvIf Request_URI "NULL\.IDA" no_log
SetEnvIf Remote_Addr 192.168.1 no_log
SetEnvIf Remote_Addr 127.0.0.1 no_log
CustomLog logs/access_log combined env=!no_log

// エラーページでサーバ情報を表示しない
ServerSignature On
↓
ServerSignature Off

// 文字化け対策
AddDefaultCharset UTF-8#AddDefaultCharset UTF-8

// iconディレクトリのファイル一覧を非表示にする
<Directory "/var/www/icons">
 Options Indexes MultiViews
↓
 Options MultiViews

// DirectoryIndex において index.php も追加する
DirectoryIndex index.html
↓
DirectoryIndex index.html index.php

// .htaccessを許可する(場合によっては FileInfo )
AllowOverride None
↓
AllowOverride All

// 許可拒否の動作順番を追加する(ホワイトリスト化)
// ブラックリスト化する場合は allow と deny を逆にする
Order deny, allow

// SSLv2 を無効にする
SSLProtocol -ALL +SSLv3 +TLSv1

// 128 ビット以上のSSL 鍵を使用させる
SSLCipherSuite ALL:!SSLv2:!LOW:!EXP:!ADH

// Trace メソッドを無効にする
TraceEnable Off

テストページと不要設定ファイルを削除する

$ rm /etc/httpd/conf.d/welcome.conf
$ rm /var/www/error/noindex.html
$ rm /etc/httpd/conf.d/welcome.conf
$ rm /etc/httpd/conf.d/userdir.conf
$ rm /etc/httpd/conf.d/autoindex.conf

コンフィグテスト
以下のコマンドを実行し「Syntax OK」が出たらよい

$ apachectl configtest

httpd起動

$ systemctl start httpd
$ systemctl enable httpd

MySQL(MariaDB)の設定

全部コメントアウトして以下を追加

$ vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
user=mysql
character-set-server = utf8
skip-character-set-client-handshake
port=3306
default-storage-engine=INNODB

slow_query_log=1
slow_query_log_file=/var/log/mysql/slow_query.log
long_query_time=1
min_examined_row_limit=1000

innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=17M
innodb_log_file_size=10M
innodb_thread_concurrency=8

[client]
default-character-set = utf8

[mysqld_safe]
log-error=/var/log/mysql/mysqld.log
pid-file=/var/run/mariadb/mysqld.pid

サービス再起動後、常駐化

$ systemctl restart mariadb
$ systemctl enable mariadb

PHPのインストール

そのままyum installをするとPHP5.4がインストールされるのでリポジトリを追加

yum -y install epel-release
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

PHP7のインストール

yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd php-mysql

設定の変更

$ vi /etc/php.ini
// ヘッダーにPHPのバージョンを出さないようにする
expose_php = On
↓
expose_php = Off

// マルチバイト文字列関数の基礎言語を日本語に
;mbstring.language = Japanese
↓
mbstring.language = Japanese

// タイムゾーン設定
;date.timezone =  
↓
date.timezone = 'Asia/Tokyo'

// 出力するエラー内容の変更
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
↓
error_reporting = E_ALL & ~E_NOTICE

// エラー出力を行う設定
;error_log = php_errors.log  
↓
error_log = "/var/log/php/php_errors.log"

// ディレクティブの拒否
allow_url_fopen = On
↓
allow_url_fopen = Off

// phpinfo() が必要ではなくなったら追加しましょう
disable_functions =
↓
disable_functions = phpinfo

※マルチバイト文字を扱う場合、必要に応じて mbstring 関係の設定も行う

Webサーバ再起動

$ systemctl restart httpd


CentOS6系との変更点について

netstatが使えなくなってssに
ifconfigがip addr showに
サービスの起動がservice.chkconfigからsystemctlに
iptablesがfirewalldに
mysqldがmariadb
変更されていたりした