Server
サーバー構築メモ|CentOS7 x86_64
CONTENTS
- 前提
- SSHサーバー|openSSH
- Webサーバー|Apache
- PHP
- FTPサーバー|vsftp
- DBサーバー|MariaDB
- Mailサーバー|Postfix
- FireWall(firewalld)の設定
- SELinux の設定
前提
- OS:CentOS 7(研究室内 Mac > VirtualBox > 仮想マシン > CentOS)
- IPアドレス:192.168.XX.XX
- サーバーに root としてSSH接続して操作
# ssh root@XXX.XXX.XXX.XXX
- OSのバージョン確認
# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core)
- アーキテクチャの確認
# arch x86_64
- カーネルのバージョン確認
# uname -a Linux CentOS7 3.10.0-957.el7.x86_64
- SELinuxの設定状況を確認(# sestatus でも確認可)
# getenforce Enforcing(有効)
- 個人の実験用なので、これを無効化
- configのバックアップ
# cp -piv /etc/selinux/config /etc/selinux/config.`date "+%Y%m%d"`
- vi で編集
# vi /etc/selinux/config
- SELINUX=enforcing を SELINUX=disabled に変更 > 保存
- 再起動
# reboot
- configのバックアップ
- 個人の実験用なので、これを無効化
SSHサーバー|openSSH
サーバーはターミナルを使って遠隔操作・・となるので、まずこれが必要
sshd のインストール
プレインストールされているので実際には以下の操作は不要
- openSSH のインストール
# yum install openssh-server
- バージョン確認
# sshd -v
- SSHサーバーの自動起動の設定
# systemctl enable sshd(ちなみに反対は disable)
- SSHサーバーの起動
# systemctl start sshd
- ファイアーウォールの構成(publicゾーンにSSHを追加・固定)
# firewall-cmd --zone=public --add-service=ssh --permanent
Webサーバー|Apache
httpd のインストールとセットアップ
- Apache のインストール
# yum install httpd
参考 yum remove httpd
- バージョン確認
# httpd -v
Server version: Apache/2.4.6 (CentOS)
- httpd の自動起動の設定
# systemctl enable
- httpd の起動と状態確認
# systemctl start httpd # systemctl status httpd
> Active: active (running) となっていればOK
ファイアーウォールの設定
- ファイアーウォールを開ける(http, https)
# firewall-cmd --zone=public --add-service=http --permanent # firewall-cmd --zone=public --add-service=https --permanent # firewall-cmd --reload
参考:「不許可」を設定する場合# firewall-cmd --zone=[ ゾーン名 ] --remove-service=[ サービス名 ] --permanent
- ファイアーウォールの状態をリストで確認
# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: enp0s3 sources: services: ssh dhcpv6-client http https ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
httpd の動作確認
- サーバーのIPアドレスを確認
# ip a 1: lo: <LOOPBACK,UP,LOWER_UP>・・・ inet 127.0.0.1/8 ・・・ 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP>・・・ inet 192.168.xxx.xxx/24・・・
一つ目はローカルループバックアドレス(localhost)です。
二つ目が外部からアクセスする場合のサーバーアドレスです。
- /var/www/html に 適当な index.html をアップ
- 別のマシンからブラウザで、閲覧できるか確認
http://192.168.xxx.xxx
ディレクトリリスティングの無効化
デフォルトのままだと、ブラウザからアクセスした際にディレクトリリストが表示されてしまい、セキュリティー的によろしくありません。そこで、この一覧を表示させないようにするため、apache の設定ファイルである httpd.conf を編集し、該当するディレクトリの Indexes オプションを無効にします。
- 変更するファイルは以下
/etc/httpd/conf/httpd.conf
- 変更部分は以下
<Directory "/var/www/html"> : # Options Indexes FollowSymLinks ← これをコメントアウト( # ) Options FollowSymLinks ← これに変更 : </Directory>
変更を保存して、Apacheを再起動して設定を有効化します。ブラウザの画面から確認。リスト表示が「Forbiddon」のメッセージに変更されればOKです。
- サーバーの再起動は、以下。
# systemctl restart httpd
PHP
リポジトリの設定
- PHPは以下のコマンドで簡単にインストールできますが、標準インストールだと 5.4系が入ります(あるいはすでに入っています)。
# yum install php
よってこれは参考まで・・ということで、続きをお読み下さい。
- PHPの最新バージョンを使用したい場合は、Yumリポジトリ(EPELとRemiリポジトリ)を追加してのインストール作業が必要になります。
- EPELリポジトリ[CentOS7系]
# yum -y install epel-release
- Remiリポジトリ[CentOS7系]
# yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
- /etc/yum.repo.d の配下の確認
# ls -l /etc/yum.repos.d/
- EPELリポジトリ[CentOS7系]
- 念のため現在インストール済みのバージョンを確認
# yum list installed | grep php php.x86_64 5.6.24-1.el7.remi php-cli.x86_64 5.6.24-1.el7.remi php-common.x86_64 5.6.24-1.el7.remi php-gd.x86_64 5.6.24-1.el7.remi php-intl.x86_64 5.6.24-1.el7.remi php-ldap.x86_64 5.6.24-1.el7.remi php-mbstring.x86_64 5.6.24-1.el7.remi php-mysqlnd.x86_64 5.6.24-1.el7.remi php-pdo.x86_64 5.6.24-1.el7.remi php-pecl-jsonc.x86_64 1.3.10-1.el7.remi.5.6 php-pecl-zip.x86_64 1.13.4-1.el7.remi.5.6 php-process.x86_64 5.6.24-1.el7.remi php-soap.x86_64 5.6.24-1.el7.remi php-xml.x86_64 5.6.24-1.el7.remi php-xmlrpc.x86_64 5.6.24-1.el7.remi
- 念のため古いものを削除
# yum remove php-*
インストール
- PHPのインストール(php7.4の場合:正しいリポジトリを見に行かせる)
# yum install --enablerepo=epel,remi,remi-php74 php php-mbstring php-gd php-pdo php-xml php-mcrypt php-mysql php-imagick
- remi-php74 の 74 がバージョンを意味します
- PHPの日本語環境を実現するため、php-mbstring をお忘れなく。
- MySQL(MariaDB)との連携のため、php-mysql をお忘れなく。
- インストール結果の確認
# yum list installed | grep php php.x86_64 7.4.13-1.el7.remi php-cli.x86_64 7.4.13-1.el7.remi php-common.x86_64 7.4.13-1.el7.remi php-gd.x86_64 7.4.13-1.el7.remi php-json.x86_64 7.4.13-1.el7.remi php-mbstring.x86_64 7.4.13-1.el7.remi php-mysqlnd.x86_64 7.4.13-1.el7.remi php-pdo.x86_64 7.4.13-1.el7.remi php-pecl-imagick.x86_64 3.4.4-10.el7.remi.7.4 php-pecl-mcrypt.x86_64 1.0.4-1.el7.remi.7.4 php-sodium.x86_64 7.4.13-1.el7.remi php-xml.x86_64 7.4.13-1.el7.remi
- 動作バージョン確認
# php -v PHP 7.4.13 (cli) (built: Nov 24 2020 10:03:34) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies
MEMO1 特定モジュールの追加インストール
以下の書き方でインストールできます。
# yum install --enablerepo=remi-php7x php-xxxx
x の部分はバージョン番号、 xxxx の部分はモジュール名
MEMO2
PHPのバージョン確認時に以下のエラーが出ることがあります。
PHP Warning: PHP Startup: Unable to load dynamic library 'gd' (tried: /usr/lib64/php/modules/gd (/usr/lib64/php/modules/gd: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/gd.so (/lib64/libraqm.so.0: undefined symbol: hb_ft_font_set_load_flags)) in Unknown on line 0
ネットで探し回ったところ・・
hb_ft_font_set_load_flags comes from HarfBuzz
ということらしく、HarfBuzz をインストールしたら解決しました。
# yum install harfbuzz
php.ini の編集
- php.ini は以下にあります。
/etc/php.ini
- オリジナルは、php_org.ini などとしてバックアップしておきます。
- 以下、変更推奨箇所です。FTPでDL>編集>UP あるいは、ターミナルから直接 viを使います。
# vi /etc/php.ini default_charset = "UTF-8" mbstring.language = Japanese mbstring.encoding_translation = Off mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII : date.timezone = "Asia/Tokyo" :
iniファイル書き換え後は、サーバーのリスタートが必要です# systemctl restart httpd
PHP環境の確認
- ドキュメントルートに 1行コード(<?php echo phpinfo(); ?>)を info.php などのファイル名で作成・保存します(以下、vi を使った例)。
$ cd /var/www/html $ vi info.php <?php echo phpinfo(); ?> :wq
- ブラウザからアクセスするとPHPに関する情報がすべて確認できます。
FTPサーバー|vsftp
fttpdのインストールとセットアップ
- vsftpd のインストール
# yum install vsftpd
- バージョン確認
# vsftpd -v vsftpd: version 3.0.2
- 設定ファイル vsftpd.conf のバックアップ
# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.org
- 設定ファイル vsftpd.conf を編集(viを使います)
# vi /etc/vsftpd/vsftpd.conf
- vi のコマンドモードで行番号を有効にします
:set number - アノニマスFTPサーバーを無効化(12行目付近)
anonymous_enable=NO
- ASCIIでのデータの送受信許可(83,84行目付近)
ascii_upload_enable=YES ascii_download_enable=YES
- 上位ディレクトリ参照可能関連設定(100行目付近)
chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list
chroot_local_user をYESにすることでホームディレクトリより上層へのアクセスが禁止されます(基本)。ただし、chroot_list_enable をYESにすると、ホームディレクトリより上層へのアクセスを許可するユーザーリストの利用が有効となります。結果、chroot_list_file(つまり/etc/vsftpd/chroot_list) に記述したユーザーのみが上層へのアクセスを許可されるので、ここに FTPユーザーを追加します。 - TCP Wrapperの無効化(127行目付近)
tcp_wrappers=NO
- ローカルタイムの使用(ファイルの末尾に以下の記述を追加)
use_localtime=YES
- /etc/vsftpd/user_list をホワイトリストとして使用(ファイルの末尾に追加)
userlist_enable=YES userlist_deny=NO
userlist_enable=YES にすると、user_list を使用したアクセス制限ができるようになります。
userlist_deny=NO にすることで user_list を「アクセスを許可するユーザーのリスト」として機能させます。逆にYES にした場合はユーザーリストは「アクセスを拒絶するユーザーのリスト」になります。 - 上記編集をすべて完了したらファイルを保存し、vi を終了する。
:w :q
- vi のコマンドモードで行番号を有効にします
- FTPサーバーへの接続を許すアカウント名を /etc/vsftpd/user_list に記述
- viで user_list を開く
# vi /etc/vsftpd/user_list
- 最初に記述されている ユーザーをすべて削除する。
- user01 というユーザーのみをFTP接続させたい場合、以下のようになる。
# vsftpd userlist # If userlist_deny=NO, only allow users in this file # If userlist_deny=YES (default), never allow users in this file, and # do not even prompt for a password. # Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers # for users that are denied. user01
- 設定したらファイルを保存してviを終了
:w :q
- viで user_list を開く
- /etc/vsftpd/chroot_list ファイルを新規に作成し、上位ディレクトリの参照を許可するアカウント名を記述
- viで chroot_list を開く
# vi /etc/vsftpd/chroot_list
- user01というユーザーのみに上位ディレクトリ参照の許可を与える場合、以下のように記述
user01
- アカウント名を追加したら保存してvimを終了
:w :q
- viで chroot_list を開く
- root 以外が chroot_list を変更できないようパーミッションを変更
# chmod 600 /etc/vsftpd/chroot_list
- vsftpdの自動起動設定
# systemctl enable vsftpd.service
- vsftpdの起動
# systemctl start vsftpd
- ファイアーウォールを開ける
# firewall-cmd --add-service=ftp --zone=public --permanent # firewall-cmd --permanent --add-port=21/tcp # firewall-cmd --reload
- FTPクライアントから接続を確認
- FTPクライアントから var/www/html が見えない?
>SELinux の設定変更が必要# setsebool -P ftpd_full_access on
- vsftpd を再起動
# systemctl restart vsftpd
以上
参考情報
- 新しいFTP接続ユーザーを作りたい場合
- useradd で新しいユーザーを追加
# useradd testuser
- passwd で testuser にパスワードを追加
# passwd testuser
- vi で user_list に testuser を追加
# vi /etc/vsftpd/user_list ファイルの最後尾に testuser を追加
- vi で chroot_list を編集し、ホワイトリストとして testuser を追加
# vi /etc/vsftpd/chroot_list ファイルの最後尾に testuser を追加
- vsftp の再起動
# systemctl restart vsftpd
- FTPクライアントから接続確認
- useradd で新しいユーザーを追加
- rootユーザのFTP接続を有効にしたい場合
rootユーザはデフォルトではFTP接続しない前提で、ftpusers というファイルに記述されているユーザは接続できない。またこのファイルの記述は user_list よりも優先される。よって、user_list に root を加えるとともに、これを編集して root の部分を除外する必要があります。# vi /etc/vsftpd/ftpusers > root をコメントアウト
- パッシブモードでの転送を許可したい場合
- /etc/vsftpd/vsftpd.conf に以下を追加
pasv_enable=YES pasv_min_port=4000 pasv_max_port=4029
- 上記で指定のポートを開ける
# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="[許可したいIP]" port protocol="tcp" port="4000-4029" accept"
- /etc/vsftpd/vsftpd.conf に以下を追加
- PAM認証で失敗している場合
deny 6なので、6回失敗したらロックがかかる仕組みになっています。- 以下で確認できます
# pam_tally2 -u <ユーザ名> Login Failures Latest failure From <ユーザ名> <失敗回数> <日付> <リモートIP>
- 回数が上限超えしている場合は、以下で失敗の回数をリセットできます。
# pam_tally2 -u <ユーザ名> --reset Login Failures Latest failure From <ユーザ名> 0
- 以下で確認できます
DBサーバー|MariaDB
別記事:Database/MySQL
DBのインストールとセットアップ
- MariaDBのインストール
# yum install mariadb mariadb-server
- 自動起動の設定
# systemctl enable mariadb
- サービスの開始
# systemctl start mariadb
- 接続(MariaDBの場合も、接続コマンドは mysql です)
# mysql
以下のように表示されれば接続OKです。Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is ・・ ・・途中略・・ MariaDB [(none)]>
- 接続を切る
MariaDB [(none)] > quit Bye
付記
MySql と postfix の仲良し関係に注意
http://big1to.com/development-note/867
Mailサーバー|Postfix
Postfixのインストール
- インストールの前に|インストールの有無の確認
$ yum list installed | grep postfix
以下のように出ればインストールされていますpostfix.x86_64 2:2.10.1-6.el7
- インストールコマンド
# yum install postfix
基本設定
- 設定情報の確認
# postconf -n ← デフォルトパラメーターとは異なる設定のみ表示
- 配送用メールサーバーを運用するのに必要な設定
- メール配信時に表示されるドメイン名の設定
- メールはサーバーから配信専用に設定
- スパムメール対策(メールリレーを許可しない)
- メールサーバー自身で外部からのメールを受信しない
- /etc/postfix/main.cf の編集手順
- FTPで接続
- main.cf をバックアップ
/etc/postfix/main.cf → main_org.cf など
- /etc/postfix/main.cf をDL
- main.cf の以下の設定を編集して FTP でアップ
- main.cf の設定箇所
- myhostname:メールサーバーのホスト名
- mydomain:メールのドメインを設定
- inet_interfaces:メール受け取りインターフェイスを指定
- inet_protocols:postfixが待ち受けを行うプロトコル(ipv4 or ipv6)
- masquerade_domains:送信元メールアドレスのサブドメイン部分(ホスト名の部分)を削除するオプション設定
- 設定後のチェック
# postfix check
エラーが表示されなければ、設定ファイルには問題なし
- main.cf設定ファイル、変更の反映(再起動)
systemctl restart postfix
FireWall(firewalld)の設定
サービスの起動
- サービスの状態確認
# systemctl status firewalld.service
Active: active (running) since ・・ となっていれば稼働中 - サービスの起動
# systemctl start firewalld.service
- サービスの終了
# systemctl stop firewalld.service
- 自動起動設定の状態確認
# systemctl is-enabled firewalld.service enabled
- 自動起動の設定
# systemctl enable firewalld.service
設定の確認
- アクティブゾーンの確認
# firewall-cmd --get-active-zones
- デフォルトゾーンの確認
# firewall-cmd --get-default-zone
- デフォルトゾーンのFW設定確認
# firewall-cmd --list-all
デフォルトゾーンとアクティブゾーンが異なる場合はアクティブゾーンの設定を見るように促されます。 - すべてのゾーンのFW設定確認
# firewall-cmd --list-all-zones
- すべてのゾーンのFW設定確認(恒久的な設定)
# firewall-cmd --list-all-zones --permanent
FWの設定
- 登録可能なサービスの確認
# firewall-cmd --get-services
- 現在追加されているサービスの確認
# firewall-cmd --list-services --zone=public dhcpv6-client ftp http https ssh
- 現在追加されているサービスの確認(恒久的な設定)
# firewall-cmd --list-services --zone=public --permanent
dhcpv6-client ssh - サービスの追加(例:publicゾーンに https を追加)
# firewall-cmd --add-service=https --zone=public
- サービスの追加(恒久的な設定)
# firewall-cmd --add-service=https --zone=public --permanent # firewall-cmd --reload success
- サービスの削除
--add-service= のかわりに --remove-service=
- 現在追加されているポート番号の確認
# firewall-cmd --list-ports --zone=public
- 現在追加されているポート番号の確認(恒久的な設定)
# firewall-cmd --list-ports --zone=public --permanent
- ポート番号の追加(例:デフォルトゾーンに TCP8080、UDP60000)
# firewall-cmd --add-port=8080/tcp --zone=public # firewall-cmd --add-port=60000/udp --zone=public
- ポート番号の追加(恒久的な設定)
# firewall-cmd --add-port=8080/tcp --zone=public --permanent # firewall-cmd --add-port=60000/udp --zone=public --permanent
- 設定の反映には再読み込みが必要
# firewall-cmd --reload success
- ポート番号の削除
-add-port= のかわりに --remove-port=
- 現在追加されているIPアドレスの確認
# firewall-cmd --list-sources --zone=public
- 許可アドレスの追加
# firewall-cmd --add-source=192.168.0.0/24 --zone=public
- 許可アドレスの追加(恒久的な設定にする場合)
# firewall-cmd --add-source=192.168.0.0/24 --zone=public --permanent # firewall-cmd --reload success
- 拒否アドレスの追加
# firewall-cmd --add-source=192.168.11.0/24 --zone=drop
- 拒否アドレスの追加(恒久的な設定にする場合)
# firewall-cmd --add-source=192.168.11.0/24 --zone=drop --permanent # firewall-cmd --reload success
- アクセス元IPに割り当てられているゾーンの変更(例:dropに変更)
# firewall-cmd --change-source=192.168.11.0/24 --zone=drop
- 同(恒久的な設定)
# firewall-cmd --change-source=192.168.11.0/24 --zone=drop --permanent # firewall-cmd --reload success
- アクセス元IPに割り当てられているゾーンの確認
# firewall-cmd --get-zone-of-source=192.168.11.0/24 drop
- IPアドレスの削除
# firewall-cmd --remove-source=192.168.11.0/24 --zone=drop
- 同(恒久的な設定)
# firewall-cmd --remove-source=192.168.11.0/24 --zone=drop --permanent # firewall-cmd --reload success
SELinux の設定
SELinux|Security-Enhanced Linux は、アメリカ国家安全保障局 (NSA) がGPL下で提供している、Linuxのカーネルに強制アクセス制御 (MAC) 機能を付加するモジュールです。
サーバー構築時に生じる「なぜ動かない?」では、これが「効いている」ことが原因である場合があります。まず、以下の手順で、一旦無効にしてみて問題が解決するかチェックし、SELinux の有効/無効 で状態が変わるようであれば、正しく関係調整する・・というのが賢明です。
- 現在の状態は sestatusコマンドで確認できます。
# sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing ← 現在有効(つまりいろいろ厳格) Mode from config file: enforcing ← 設定ファイルも「有効」になっている Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 31
- 一時的に permissiveモードにするには以下。
# setenforce 0
これで症状が解決する場合は、SELinux が効いている・・よってどんなエラーが出ているかログを見て調整すればよい・・ということになります。
参考情報
http://www.yam-web.net/selinux/base.html
SELinux の動作モード
Disabled / Permissive / Enforcing の 3 モードがあります.
- Disabled
SELinux が適用されていない状態。監査ログも残らないしリソースへのアクセスも自由にできます。 - Permissive
SELinux は適用されているがアクセス制御が実行されない。ポリシに違反するアクセスは監査ログに記録されます。SELinux のチューニングに使います。 - Enforcing
SELinux によるアクセス制御が有効になっている状態。後述のチューニングを終え運用状態に移行したらこのモードにします。ポリシに違反するアクセスは全て遮断されます。
設定について
- Permissive と Enforcing の一時的な切り替えは setenforce コマンド
# setenforce 0
- 恒久的にモードを固定する場合は /etc/selinux/config を書き換え