【CentOS8】クローラ拒否設定(robots.txt .htaccess)

DocumentRoot /var/www/dev の場合

robots.txtでクローラ拒否

# vi /var/www/dev/robots.txt
User-Agent:*
Disallow:/

.htaccessでクローラ拒否

httpd.conf に記述してもOK。
# vi /var/www/dev/.htaccess
SetEnvIf User-Agent "Googlebot" ng_ua
SetEnvIf User-Agent "bingbot" ng_ua
order Allow,Deny
Allow from all
Deny from env=ng_ua

【CentOS8】Ruby2.7.1のインストール

dnfでもRubyはインストールできますが、2.5.5とバージョンが古いので、
rbenvを使って最新のRuby2.7.1をインストールします。
# dnf list avialable ruby
milter-manager_repos                                                                406  B/s | 819  B     00:02
milter-manager_repos-source                                                         400  B/s | 819  B     00:02
Available Packages
ruby.i686                               2.5.5-105.module_el8.1.0+214+9be47fd7                              AppStream
ruby.x86_64                             2.5.5-105.module_el8.1.0+214+9be47fd7                              AppStream

rbenvのインストール

CentOS8インストール時におおよそのもの、git、openssl-develなどはデフォルトで入っています。
こちらの環境で必要なものは readline-devel、nodejsでした。
必要なパッケージインストール
# yum -y install readline-devel nodejs
epelリポジトリが追加されていない場合は追加。
epelリポジトリの追加
# dnf -y install epel-release
rbenvをダウンロード
# git clone https://github.com/rbenv/rbenv.git ~/.rbenv
Pathなどを追加
# echo 'export PATH="~/.rbenv/bin:$PATH"' >> ~/.bash_profile
# echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
# source ~/.bash_profile
rbenv intすると、下記のメッセージが。
# Load rbenv automatically by appending
# the following to ~/.bash_profile:

eval "$(rbenv init -)"
手動でやるな、自動でやれと。
rbenvバージョン確認
# rbenv -v
rbenv 1.1.2-30-gc879cb0

Rubyのインストール

Ruby最新バージョン確認
# rbenv install --list
2.5.8
2.6.6
2.7.1
jruby-9.2.11.1
maglev-1.0.0
mruby-2.1.1
rbx-5.0
truffleruby-20.1.0

Only latest stable releases for each Ruby implementation are shown.
Use 'rbenv install --list-all' to show all local versions.
Rubyインストール
# rbenv install 2.7.1
使用するRubyのバージョン指定
# rbenv global 2.7.1
# rbenv rehash
rbenvでバージョンを指定してやらないと下記のメッセージ。
# ruby -v
rbenv: ruby: command not found

The `ruby' command exists in these Ruby versions:
  2.7.1
Rubyバージョン確認
# ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]

【CentOS8】glib2.6インストール時に [meson.build:1814:2: ERROR: Dependency "mount" not found, tried pkgconfig]

# cd glib-2.60.7
# meson _build
・
・
Dependency mount found: NO (tried pkgconfig)

meson.build:1814:2: ERROR:  Dependency "mount" not found, tried pkgconfig
libmount-devel をインストールする事で解決。
# dnf -y install libmount-devel

CentOS8でサーバー構築 - 8.ファイアーウォール(Firewalld)

以前は iptablesで管理していましたが、CentOS7以降デフォルトで
Firewalldが使われることになったので、こちらを使う。
zoneは publicのみ設定します。

Firewalldの起動

現在起動していているか確認
# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
既にインストールされていているが起動していない。
firewall-cmdでも確認できる
# firewall-cmd --state
not running
パッケージが最新か確認
# dnf list firewalld
CentOS-8 - AppStream                                      448 kB/s | 4.3 kB     00:00
CentOS-8 - Base                                            87 kB/s | 3.9 kB     00:00
CentOS-8 - Extras                                         169 kB/s | 1.5 kB     00:00
CentOS-8 - PowerTools                                      21 kB/s | 4.3 kB     00:00
Extra Packages for Enterprise Linux Modular 8 - x86_64     15 kB/s | 8.1 kB     00:00
Extra Packages for Enterprise Linux 8 - x86_64             10 kB/s | 7.9 kB     00:00
Remi's Modular repository for Enterprise Linux 8 - x86_64 3.5 kB/s | 3.5 kB     00:00
Safe Remi's RPM repository for Enterprise Linux 8 - x86_6 3.1 kB/s | 3.0 kB     00:00
Installed Packages
firewalld.noarch                          0.7.0-5.el8_1.1                          @BaseOS
Available Packages
firewalld.noarch                          0.8.0-4.el8                              BaseOS
0.8が使えるようなのでupdate。dnfではupdateも使えるがupgradeが正しいオプション。
アップグレード
# dnf -y upgrade firewalld
起動
# systemctl start firewalld
起動したとたん、SSHの接続が切られました。事によってはデータセンターに行くパターンです。
設定サービスの確認
# firewall-cmd --zone=public --list-services
cockpit dhcpv6-client ssh
IPv6は使う予定が無いので dhcpv6-clientの通信を停止しておきます。
dhcpv6-client停止
# firewall-cmd --permanent --remove-service=dhcpv6-client
success
# firewall-cmd --reload
見慣れないcockpitはCentOS8の操作をWEB上からできるとか。
セキュリティ面を考慮しないとすぐには利用したくないので、こちらも一旦停止しておきます。
cockpit停止
# firewall-cmd --permanent --remove-service=cockpit
success
# firewall-cmd --reload
success
http https追加
# firewall-cmd --permanent --add-service=http
success
# firewall-cmd --permanent --add-service=https
success
# firewall-cmd --reload
success
確認
# firewall-cmd --zone=public --list-services
http https ssh
cockpitはデフォルトでインストールされていました。
# dnf list installed |grep cockpit
cockpit.x86_64                              196.3-1.el8                                @BaseOS
cockpit-bridge.x86_64                       196.3-1.el8                                @BaseOS
cockpit-packagekit.noarch                   197.3-1.el8                                @AppStream
cockpit-system.noarch                       196.3-1.el8                                @BaseOS
cockpit-ws.x86_64                           196.3-1.el8                                @BaseOS

メール関連のサービス追加

必要に応じて、smtp, smtps, pop3, pop3s, imap, imapsを追加。
# firewall-cmd --permanent --add-service=smtp
success
# firewall-cmd --permanent --add-service=smtps
success
# firewall-cmd --permanent --add-service=pop3
success
# firewall-cmd --permanent --add-service=pop3s
success
# firewall-cmd --reload
success

SSHのポートを変更対応

SSHのPortを12345に変更。
ssh.xmlコピー
# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh.xml
ssh.xm編集
# vi /etc/firewalld/services/ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="12345"/>
</service>
設定反映
# firewall-cmd --reload
success

FTPのポートを変更対応

FTPのPortを12345に変更。
PASV_PORT: 60100-60100
ftp.xmlコピー
# cp /usr/lib/firewalld/services/ftp.xml /etc/firewalld/services/ftp.xml
ftp.xml編集
# vi /etc/firewalld/services/ftp.xml
?xml version="1.0" encoding="utf-8"?>
<service>
  <short>FTP</short>
  <description>FTP is a protocol used for remote file transfer. If you plan to make your FTP server publicly available, enable this option. You need the vsftpd package installed for this option to be useful.</description>
  <port protocol="tcp" port="12345"/>
  <helper name="ftp"/>
</service>
追加されていない場合はftp追加
# firewall-cmd --permanent --add-service=ftp
success
PASVポート追加
# firewall-cmd --zone=public --permanent --add-port=60000-60100/tcp
success
設定反映
# firewall-cmd --reload
success
確認
# firewall-cmd --list-ports
60000-60100/tcp

コマンドまとめ

起動の確認
firewall-cmd --state
設定の確認
firewall-cmd --list-all
firewall-cmd --get-active-zone
firewall-cmd --zone=public --list-services
firewall-cmd --list-ports
サービスの追加
 firewall-cmd --permanent --add-service=ftp
サービスの削除
firewall-cmd --permanent --remove-service=ftp
設定反映
firewall-cmd --reload
特定のIPを拒否
firewall-cmd --zone=drop --permanent --add-source=46.38.148.0/22
lsofコマンドで現在使っているポートを確認
# lsof -i -nP
・
・
httpd      4176          apache    3u  IPv4  24324      0t0  TCP *:80 (LISTEN)
dovecot    8231            root   23u  IPv4 463784      0t0  TCP *:110 (LISTEN)
dovecot    8231            root   24u  IPv6 463785      0t0  TCP *:110 (LISTEN)
dovecot    8231            root   25u  IPv4 463786      0t0  TCP *:995 (LISTEN)
dovecot    8231            root   26u  IPv6 463787      0t0  TCP *:995 (LISTEN)
dovecot    8231            root   41u  IPv4 463832      0t0  TCP *:143 (LISTEN)
dovecot    8231            root   42u  IPv6 463833      0t0  TCP *:143 (LISTEN)
dovecot    8231            root   43u  IPv4 463834      0t0  TCP *:993 (LISTEN)
dovecot    8231            root   44u  IPv6 463835      0t0  TCP *:993 (LISTEN)
master     8346            root   16u  IPv4 467529      0t0  TCP *:25 (LISTEN)
master     8346            root   20u  IPv4 467532      0t0  TCP *:465 (LISTEN)
・
・

CentOS8でサーバー構築 - 7.Postfix3.3+Dovecot2.3の暗号化設定(SSL/TLS)

以前、CentOS8でサーバー構築 - 2.Postfix+Dovecot(MTA)で、Gmail経由でメールを送受信できるところまで設定しました。
今回は、暗号化してSMTPS Port465、POP3S Port995でメールの送受信をできるようにします。
Portはルーター、firewalld、パケットフィルタリング、などは開けておくこと。
使用するホスト名:mail.kowloonet.net

Let's Encryptで証明書取得

無料でアラートが出ないSSLを使えるようになったなんて、便利になったもんです。。
ここでは Let's Encrypt でTLS暗号化します。
certbotをdnfでインストールできるか確認
# dnf info certbot
Last metadata expiration check: 0:03:12 ago on Sun 14 Jun 2020 10:52:38 AM JST.
Available Packages
Name         : certbot
Version      : 1.4.0
Release      : 1.el8
Architecture : noarch
Size         : 46 k
Source       : certbot-1.4.0-1.el8.src.rpm
Repository   : epel
Summary      : A free, automated certificate authority client
URL          : https://pypi.python.org/pypi/certbot
License      : ASL 2.0
Description  : certbot is a free, automated certificate authority that aims
             : to lower the barriers to entry for encrypting all HTTP traffic on the
             : internet.
epelリポジトリをインストールしていない場合はインストールする。
epelリポジトリ追加・インストール
# dnf -y install epel-release
certbotインストール
# dnf install cerbot
certbot用に使用するホスト名 mail.kowloonet.netで外部から接続できるようにする。
certbot実行時に使用するホスト名がhttpやhttpsで正しく接続できるかを確認しに行きます。
使用するホスト名はDNSレコードに追加しておくこと。
Webサーバーを公開していない場合のやり方は割愛します。
Apacheバーチャルホスト設定
# vi /etc/httpd/conf.d/virtualhost-kowloonet.net.conf
<VirtualHost *:80>
  ServerName kowloonet.net
  ServerAlias mail.kowloonet.net
  DocumentRoot /var/www/html
</VirtualHost>
Apache再起動
# systemctl restart httpd
certbotで証明書作成
# certbot certonly --webroot -w /var/www/html/ -m メールアドレス -d mail.kowloonet.net --agree-tos

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N ←初回だけ聞かれる

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for mail.kowloonet.net
Using the webroot path /var/www/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/mail.kowloonet.net/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/mail.kowloonet.net/privkey.pem
   Your cert will expire on 2020-09-12. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Postfixの設定

Postfixのバージョンは 3.3.1でした。
Postfixのバージョン確認
# postconf | grep mail_version
mail_version = 3.3.1
milter_macro_v = $mail_name $mail_version
main.cf設定
# vi /etc/postfix/main.cf
# the server certificate first, then the issuing CA(s) (bottom-up order).
#
#smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.kowloonet.net/fullchain.pem
・
・
#smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
smtpd_tls_key_file = /etc/letsencrypt/live/mail.kowloonet.net/privkey.pem

# Announce STARTTLS support to remote SMTP clients, but do not require that
# clients use TLS encryption (opportunistic TLS inbound).
#
smtpd_tls_security_level = may
・
・
# Use TLS if this is supported by the remote SMTP server, otherwise use
# plaintext (opportunistic TLS outbound).
#
smtp_tls_security_level = may

tls_high_cipherlist = HIGH:!aNULL:!eNULL:!SSLv2:!SSLv3:!kRSA:!kDHd:!EXPORT:!ADH:!DSS:!PSK:!SRP:!RC4:!MD5:!DES:!3DES:!EXP:!SEED:!IDEA:!3DES:!LOW@STRENGTH
smtp_tls_ciphers = high
smtpd_tls_ciphers = high
smtpd_tls_mandatory_ciphers = high

smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3
smtp_tls_mandatory_protocols=!SSLv2,!SSLv3
smtpd_tls_protocols=!SSLv2,!SSLv3
smtp_tls_protocols=!SSLv2,!SSLv3
master.cfの設定
# vi /etc/postfix/master.cf
# ======================================
smtp      inet  n       -       n       -       -       smtpd
#smtp      inet  n       -       n       -       1       postscreen
#smtpd     pass  -       -       n       -       -       smtpd
#dnsblog   unix  -       -       n       -       0       dnsblog
#tlsproxy  unix  -       -       n       -       0       tlsproxy
#submission inet n       -       n       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_tls_auth_only=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       n       -       -       smtpd
#  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
#628       inet  n       -       n       -       -       qmqpd
pickup    unix  n       -       n       60      1       pickup
cleanup   unix  n       -       n       -       0       cleanup
qmgr      unix  n       -       n       300     1       qmgr
#qmgr     unix  n       -       n       300     1       oqmgr
tlsmgr    unix  -       -       n       1000?   1       tlsmgr
Postfix再起動
# systemctl restart postfix

Dovecotの設定

アップグレードしてdovecotのバージョンが2.2から2.3に変わり、設定ファイルが結構変わり以前だったら出なかったWarningが結構出るようになり、 色々mergeするのも面倒だったので、dovecotを一旦removeして再インストールしました。
Dovecotのバージョン2.3.8で対応します。
デフォルトで ssl = required になっていましたq。
アップデートに伴いWarning出た件は下記参照。
dovecote再インストール
# dnf remove dovecot
# dnf -y install dovecot
remove後も設定ファイルは 10-ssl.conf.rpmsave などで残ります。
dovecotのバージョン確認
# dovecot --version
2.3.8 (9df20d2db)
10-mail.conf設定
# vi /etc/dovecot/conf.d/10-mail.conf
# <doc/wiki/MailLocation.txt>
#
mail_location = maildir:~/Maildir
10-auth.conf設定
# vi /etc/dovecot/conf.d/10-auth.conf
# See also ssl=required setting.
disable_plaintext_auth = no
10-ssl.confの設定
# vi /etc/dovecot/conf.d/10-ssl.conf
# SSL/TLS support: yes, no, required. 
# disable plain pop3 and imap, allowed are only pop3+TLS, pop3s, imap+TLS and imaps
# plain imap and pop3 are still allowed for local connections
ssl = required

# PEM encoded X.509 SSL/TLS certificate and private key. They're opened before
# dropping root privileges, so keep the key file unreadable by anyone but
# root. Included doc/mkcert.sh can be used to easily generate self-signed
# certificate, just make sure to update the domains in dovecot-openssl.cnf
#ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
#ssl_key = </etc/pki/dovecot/private/dovecot.pem
ssl_cert = </etc/letsencrypt/live/mail.kowloonet.net/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.kowloonet.net/privkey.pem
・
・
# SSL DH parameters
# Generate new params with `openssl dhparam -out /etc/dovecot/dh.pem 4096`
# Or migrate from old ssl-parameters.dat file with the command dovecot
# gives on startup when ssl_dh is unset.
ssl_dh = </etc/dovecot/dh.pem

# Minimum SSL protocol version to use. Potentially recognized values are SSLv3,
# TLSv1, TLSv1.1, and TLSv1.2, depending on the OpenSSL version used.
ssl_min_protocol = TLSv1.2

# SSL ciphers to use, the default is:
#ssl_cipher_list = ALL:!kRSA:!SRP:!kDHd:!DSS:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK:!RC4:!ADH:!LOW@STRENGTH
# To disable non-EC DH, use:
#ssl_cipher_list = ALL:!DH:!kRSA:!SRP:!kDHd:!DSS:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK:!RC4:!ADH:!LOW@STRENGTH
#ssl_cipher_list = PROFILE=SYSTEM
ssl_cipher_list = HIGH:!aNULL:!eNULL:!SSLv2:!SSLv3:!kRSA:!kDHd:!EXPORT:!ADH:!DSS:!PSK:!SRP:!RC4:!MD5:!DES:!3DES:!EXP:!SEED:!IDEA:!3DES:!LOW@STRENGTH
・
・
# Prefer the server's order of ciphers over client's.
ssl_prefer_server_ciphers = yes
ssl_prefer_server_ciphers:
このディレクティブを yes に設定すると、接続先のクライアントが指定された暗号化の命令に従います。
dh.pemの作製
 OpenSSL 1.1.1c FIPS です。
# openssl dhparam 4096 -out /etc/dovecot/dh.pem
 結構時間かかります。
v2.2の古いパラメータを使いたい場合は
dd if=/var/lib/dovecot/ssl-parameters.dat bs=1 skip=88 | openssl dhparam -inform der > dh.pem
と書いてあったので、特に必要ない場合は
openssl dhparam 4096 > dh.pem
の方が良さげです。
dovecot起動設定
# systemctl start dovecot
# systemctl enable dovecot
Created symlink /etc/systemd/system/multi-user.target.wants/dovecot.service → /usr/lib/systemd/system/dovecot.service.
指定するcipherを個別に TLS_AES_256_GCM_SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256 など指定しても良いです。
こちらを参考にしました
4.13. TLS 設定の強化 Red Hat Enterprise Linux 7 | Red Hat Customer Portal
推奨事項を満たす暗号化スイートを一覧表示
# openssl ciphers -v 'kEECDH+aECDSA+AES:kEECDH+AES+aRSA:kEDH+aRSA+AES' | column -t
TLS_AES_256_GCM_SHA384         TLSv1.3  Kx=any   Au=any    Enc=AESGCM(256)             Mac=AEAD
TLS_CHACHA20_POLY1305_SHA256   TLSv1.3  Kx=any   Au=any    Enc=CHACHA20/POLY1305(256)  Mac=AEAD
TLS_AES_128_GCM_SHA256         TLSv1.3  Kx=any   Au=any    Enc=AESGCM(128)             Mac=AEAD
TLS_AES_128_CCM_SHA256         TLSv1.3  Kx=any   Au=any    Enc=AESCCM(128)             Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384  TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AESGCM(256)             Mac=AEAD
ECDHE-ECDSA-AES256-CCM8        TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AESCCM8(256)            Mac=AEAD
ECDHE-ECDSA-AES256-CCM         TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AESCCM(256)             Mac=AEAD
ECDHE-ECDSA-AES128-GCM-SHA256  TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AESGCM(128)             Mac=AEAD
ECDHE-ECDSA-AES128-CCM8        TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AESCCM8(128)            Mac=AEAD
ECDHE-ECDSA-AES128-CCM         TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AESCCM(128)             Mac=AEAD
ECDHE-ECDSA-AES256-SHA384      TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AES(256)                Mac=SHA384
ECDHE-ECDSA-AES128-SHA256      TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AES(128)                Mac=SHA256
ECDHE-ECDSA-AES256-SHA         TLSv1    Kx=ECDH  Au=ECDSA  Enc=AES(256)                Mac=SHA1
ECDHE-ECDSA-AES128-SHA         TLSv1    Kx=ECDH  Au=ECDSA  Enc=AES(128)                Mac=SHA1
ECDHE-RSA-AES256-GCM-SHA384    TLSv1.2  Kx=ECDH  Au=RSA    Enc=AESGCM(256)             Mac=AEAD
ECDHE-RSA-AES128-GCM-SHA256    TLSv1.2  Kx=ECDH  Au=RSA    Enc=AESGCM(128)             Mac=AEAD
ECDHE-RSA-AES256-SHA384        TLSv1.2  Kx=ECDH  Au=RSA    Enc=AES(256)                Mac=SHA384
ECDHE-RSA-AES128-SHA256        TLSv1.2  Kx=ECDH  Au=RSA    Enc=AES(128)                Mac=SHA256
ECDHE-RSA-AES256-SHA           TLSv1    Kx=ECDH  Au=RSA    Enc=AES(256)                Mac=SHA1
ECDHE-RSA-AES128-SHA           TLSv1    Kx=ECDH  Au=RSA    Enc=AES(128)                Mac=SHA1
DHE-RSA-AES256-GCM-SHA384      TLSv1.2  Kx=DH    Au=RSA    Enc=AESGCM(256)             Mac=AEAD
DHE-RSA-AES256-CCM8            TLSv1.2  Kx=DH    Au=RSA    Enc=AESCCM8(256)            Mac=AEAD
DHE-RSA-AES256-CCM             TLSv1.2  Kx=DH    Au=RSA    Enc=AESCCM(256)             Mac=AEAD
DHE-RSA-AES128-GCM-SHA256      TLSv1.2  Kx=DH    Au=RSA    Enc=AESGCM(128)             Mac=AEAD
DHE-RSA-AES128-CCM8            TLSv1.2  Kx=DH    Au=RSA    Enc=AESCCM8(128)            Mac=AEAD
DHE-RSA-AES128-CCM             TLSv1.2  Kx=DH    Au=RSA    Enc=AESCCM(128)             Mac=AEAD
DHE-RSA-AES256-SHA256          TLSv1.2  Kx=DH    Au=RSA    Enc=AES(256)                Mac=SHA256
DHE-RSA-AES128-SHA256          TLSv1.2  Kx=DH    Au=RSA    Enc=AES(128)                Mac=SHA256
DHE-RSA-AES256-SHA             SSLv3    Kx=DH    Au=RSA    Enc=AES(256)                Mac=SHA1
DHE-RSA-AES128-SHA             SSLv3    Kx=DH    Au=RSA    Enc=AES(128)                Mac=SHA1
v2.2の設定ファイル 10-ssl.conf を修正していたら下記エラーが起こりました。
v2.3にアップデート後に設定ファイルを適切に対応するには
/usr/share/doc/dovecot/example-config/conf.d/10-ssl.conf
を参考にすると良いです。
Jun 22 08:31:30 kowloonet dovecot[6465]: config: Warning: Obsolete setting in /etc/dovecot/conf.d/10-ssl.conf:51: ssl_dh_parameters_length is no longer needed
Jun 22 08:31:30 kowloonet dovecot[6465]: config: Warning: Obsolete setting in /etc/dovecot/conf.d/10-ssl.conf:54: ssl_protocols has been replaced by ssl_min_protocol
Jun 22 08:37:56 kowloonet dovecot[6569]: config: Warning: please set ssl_dh=</etc/dovecot/dh.pem
ssl_dh を指定しない時のエラー。
un 22 08:21:10 kowloonet dovecot[6388]: pop3-login: Error: Failed to initialize SSL server context: Can't load DH parameters: error:1408518A:SSL routines:ssl3_ctx_ctrl:dh key too small: user=<>, rip=xxx.xxx.xxx.xxx, lip=xxx.xxx.xxx.xxx, session=<VbetYaCoIfF+hMEL>

CentOS8でサーバー構築 - 6.FTPサーバーの設定(vsftpd SSL/TLSなど)

以前にCentOS8でサーバー構築 - 1.環境設定でFTPを使えるようにはしましたが、
実際に運用するにはセキュリティーなどを強化してから使用することにします。
今回 Portは 12345、PASV_PORTは60000-60100、クライアントの公開鍵認証は無しで設定します。
ルータやパケットフィルタリング、firewallなどを開けておく事。
vsftpd: version 3.0.3、OpenSSL 1.1.1c です。
この組み合わせだとTLSv1.3で認証する。
(CentOS7では vsftpd: version 3.0.2、OpenSSL 1.0.2k-fips TLSv1.2で認証)
使用したクライアントソフトはFFFTP Ver 4.7、FileZilla 3.48.1
設定一覧
listen_port12345
anonymous_enableNO
匿名での接続を許可
dirmessage_enableNO
ディレクトリに.messageファイルがあれば表示
xferlog_file/var/log/vsftpd.log
xferlog_std_formatNO
NOにした場合は詳細なログを記載
ascii_upload_enableYES
アップロード時ASCIIモードでのデータ転送を許可
ascii_download_enableYES
ダウンロード時ASCIIモードでのデータ転送を許可
chroot_local_userYES
すべてのローカルユーザのログインをchrootで管理
ホームディレクトリの外側にアクセス不可
chroot_list_enableYES
chroot_local_user=YESの場合、chroot_list_fileで指定した
ユーザのみホームディレクトリの外側にアクセス可
chroot_list_file/etc/vsftpd/chroot_list
ここに記載のあるユーザのみホームディレクトリの外側にアクセス可
allow_writeable_chrootYES
YESにしないと、chroot_listに記載のないユーザは接続できなくなる
userlist_enableYES
userlist_fileを有効
userlist_denyNO
userlist_enable=YESの場合
YES: userlist_fileに記載されたユーザのログインを拒否
NO: userlist_fileに記載されたユーザのログインを許可
userlist_file/etc/vsftpd/allowed_user_list
userlist_deny=NOにしてある場合は、
ここに記載のあるユーザのみログインを許可
ssl_enableYES
SSL/TLSの設定を有効
ssl_tlsv1_2YES
TLSv1.2を利用可。TLSv1.3も利用する模様
ssl_ciphersHIGH
これを設定しないと、デフォルトのDES-CBC3-SHAになり、
使用するクライアントソフトによっては接続できないかも。
cipherを直接記載しても良い。
force_local_logins_sslYES
SSL/TLSを使用時のみユーザのログインを許可
force_local_data_sslYES
SSL/TLSを使用時のみデーター転送を許可
rsa_cert_file/etc/pki/tls/certs/vsftpd.pem
証明書のパス
Let's Encrypt などで証明書を取得済みの場合はそちらのパスを
debug_sslYES
SSL関連のログを記載
pasv_min_port60000
pasv_max_port60100
TLS1.0、TLS1.1には既に脆弱性が見つかっているので、TLS1.2以上の利用を推奨。

vsftpd.confの設定

マニュアルも一部追加で記載。
設定
# vi /etc/vsftpd/vsftpd.conf
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=NO
・
・
# Activate directory messages - messages given to remote users when they
# go into a certain directory.
dirmessage_enable=NO
・
・
# You may override where the log file goes if you like. The default is shown
# below.
xferlog_file=/var/log/vsftpd.log
#
# If you want, you can have your log file in standard ftpd xferlog format.
# Note that the default log file location is /var/log/xferlog in this case.
xferlog_std_format=NO
・
・
# ASCII mangling is a horrible feature of the protocol.
ascii_upload_enable=YES
ascii_download_enable=YES
・
・
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
# (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
# the user does not have write access to the top level directory within the
# chroot)
chroot_local_user=YES
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES
・
・
# When "listen" directive is enabled, vsftpd runs in standalone mode and
# listens on IPv4 sockets. This directive cannot be used in conjunction
# with the listen_ipv6 directive.
listen=YES
#
# This directive enables listening on IPv6 sockets. By default, listening
# on the IPv6 "any" address (::) will accept connections from both IPv6
# and IPv4 clients. It is not necessary to listen on *both* IPv4 and IPv6
# sockets. If you want that (perhaps because you want to listen on specific
# addresses) then you must run two copies of vsftpd with two configuration
# files.
# Make sure, that one of the listen options is commented !!
listen_ipv6=NO

pam_service_name=vsftpd
userlist_enable=YES
・
・ここから追加、デフォルトで有効無効になっているものも、明示的に記載在り
#
# This option is examined if userlist_enable is activated. If you set this
# setting to NO, then users will be denied login unless they are explicitly
# listed in the file specified by userlist_file. When login is denied, the
# denial is issued before the user is asked for a password. Default: YES
userlist_deny=NO
#
# This option is the name of the file loaded when the userlist_enable
# option is active. Default: /etc/vsftpd.user_list
userlist_file=/etc/vsftpd/allowed_user_list
#
# If enabled, vsftpd will display directory listings with the time in your
# local time zone. The default is to display GMT. The times returned by
# the MDTM FTP command are also affected by this option. Default: NO
use_localtime=YES
#
# If activated, files and directories starting with . will be shown in
# directory listings even if the "a" flag was not used by the client.
# This override excludes the "." and ".." entries. Default: NO
force_dot_files=NO
#
# When enabled, allows use of the SITE CHMOD command. NOTE! This
# only applies to local users. Anonymous users never get to use SITE CHMOD.
# Default: YES
chmod_enable=YES
#
# If vsftpd is in standalone mode, this is the port it will listen on
# for incoming FTP connections. Default: 21
listen_port=12345
#
# If enabled, and vsftpd was compiled against OpenSSL, vsftpd will support
# secure connections via SSL. This applies to the control connection (including
# login) and also data connections. You'll need a client with SSL support too.
# NOTE!! Beware enabling this option. Only enable it if you need it. vsftpd can
# make no guarantees about the security of the OpenSSL libraries. By enabling
# this option, you are declaring that you trust the security of your installed
# OpenSSL library. Default: NO
ssl_enable=YES
ssl_sslv2=NO
ssl_sslv3=NO
ssl_tlsv1=NO
ssl_tlsv1_1=NO
ssl_tlsv1_2=YES
#
# This option can be used to select which SSL ciphers vsftpd will allow for
# encrypted SSL connections. See the ciphers man page for further details.
# Note that restricting ciphers can be a useful security precaution as it
# prevents malicious remote parties forcing a cipher which they have found
# problems with. Default: DES-CBC3-SHA
ssl_ciphers=HIGH
#
# If set to yes, all SSL data connections are required to exhibit SSL session
# reuse (which proves that they know the same master secret as the control
# channel). Although this is a secure default, it may break many FTP clients,
# so you may want to disable it. For a discussion of the consequences, see
# http://scarybeastsecurity.blogspot.com/2009/02/vsftpd-210-released.html
# (Added in v2.1.0). Default: YES
require_ssl_reuse=YES
force_local_logins_ssl=YES
force_local_data_ssl=YES
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem
#
# If enabled, then any log output which would have gone to /var/log/vsftpd.log
# goes to the system log instead. Logging is done under the FTPD facility.
# default: NO
syslog_enable=NO
#
# If true, OpenSSL connection diagnostics are dumped to the vsftpd log file.
# (Added in v2.0.6). Default: NO
debug_ssl=YES
#
# The minimum port to allocate for PASV style data connections. Can be used
# to specify a narrow port range to assist firewalling. Default: 0 (use any port)
pasv_min_port=60000
pasv_max_port=60100
allow_writeable_chroot=YES にしないと環境により下記エラーが起こる。
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
古いクライアントソフトだとデフォルト設定 require_ssl_reuse=YESの環境下では
上記英文のマニュアルで多くのFTPクライアントは壊れると言っているように
522 SSL connection failed: session reuse required
とファイルリストが表示されない事がある。
Let's Encrypt で証明書を取得済みの場合は
rsa_cert_file=/etc/letsencrypt/live/xxxxxxxxx.com/fullchain.pem
rsa_private_key_file=/etc/letsencrypt/live/xxxxxxxxx.com/privkey.pem

ユーザの設定

FTP接続を許可するユーザの追加
# echo "ユーザ名" >> /etc/vsftpd/allowed_user_list
ホームディレクトリ以外の参照を許可するユーザの追加
# echo "ユーザ名" >> /etc/vsftpd/chroot_list

SSL/TLS対応

有効期限は約10年に。
色々聞かれますが、何も記載せず[ENTER]でいけますが、ある程度は入力しておきましょう。
証明書の作製
# cd /etc/pki/tls/certs
# openssl req -x509 -nodes -newkey rsa:2048 -keyout vsftpd.pem -out vsftpd.pem -days 3650
Generating a RSA private key
.+++++
...................+++++
writing new private key to 'vsftpd.pem'
-----
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) []:Chiba
Locality Name (eg, city) [Default City]:Funabashi
Organization Name (eg, company) [Default Company Ltd]:KOWLOONET.NET
Organizational Unit Name (eg, section) []:rhizome
Common Name (eg, your name or your server's hostname) []:kowloonet.net
Email Address []:メールアドレス。記載した場合接続したときに表示されます。
パーミッション変更
# chmod 400 vsftpd.pem
証明書の確認
# openssl x509 -text -noout -in /etc/pki/tls/certs/vsftpd.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            1f:81:8f:0e:d6:c1:da:f8:c7:6e:31:39:6d:dc:d4:2a:51:e8:60:f4
        Signature Algorithm: sha256WithRSAEncryption
・
・

再起動して確認

vsftpd再起動
# systemctl restart vsftpd
SSL/TLS接続の確認
# openssl s_client -connect localhost:12345 -starttls ftp
CONNECTED(00000003)
・
・
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 3349 bytes and written 751 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
220 (vsFTPd 3.0.3)
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
・
・
TLSv1.3の様です。ssl_tlsv1_2=YES だとTLSv1.2以上で利用可という事でしょうか。
よくわからず、今後の課題としておきます。
FTPクライアントソフトで確認
   割愛します。

以上でFTPの設定は終了です。

その他

FFFTPで接続時、下記の様なエラーが吐かれる。接続・転送などは特に問題なし。
調べてはみたものの、原因は不明。
FFFTPがTLS1.3に対応していないとかその辺??
Wed Jun 17 05:29:30 2020 [pid 9039] [ユーザ名] DEBUG: Client "xxx.xxx.xxx.xxx", "SSL ret: 18446744073709551615, SSL error: error:00000000:lib(0):func(0):reason(0), errno: 0"
証明書のパス rsa_cert_fileが正しくない時のエラー
500 OOPS: SSL: could not set cipher list
vsftpdがデフォルトで使用する暗号はDES-CBC3-SHAと記載されているが、サーバーには見当たらず。
CentOS8 OpenSSL 1.1.1c
# openssl ciphers -v | grep 'DES-CBC3-SHA'
#
試しにCentOS7では、
CentOS7.6 OpenSSL 1.0.2k-fips
# openssl ciphers -v | grep 'DES-CBC3-SHA'
ECDHE-RSA-DES-CBC3-SHA  SSLv3 Kx=ECDH     Au=RSA  Enc=3DES(168) Mac=SHA1
ECDHE-ECDSA-DES-CBC3-SHA SSLv3 Kx=ECDH     Au=ECDSA Enc=3DES(168) Mac=SHA1
EDH-RSA-DES-CBC3-SHA    SSLv3 Kx=DH       Au=RSA  Enc=3DES(168) Mac=SHA1
EDH-DSS-DES-CBC3-SHA    SSLv3 Kx=DH       Au=DSS  Enc=3DES(168) Mac=SHA1
DH-RSA-DES-CBC3-SHA     SSLv3 Kx=DH/RSA   Au=DH   Enc=3DES(168) Mac=SHA1
DH-DSS-DES-CBC3-SHA     SSLv3 Kx=DH/DSS   Au=DH   Enc=3DES(168) Mac=SHA1
ECDH-RSA-DES-CBC3-SHA   SSLv3 Kx=ECDH/RSA Au=ECDH Enc=3DES(168) Mac=SHA1
ECDH-ECDSA-DES-CBC3-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=3DES(168) Mac=SHA1
DES-CBC3-SHA            SSLv3 Kx=RSA      Au=RSA  Enc=3DES(168) Mac=SHA1
KRB5-DES-CBC3-SHA       SSLv3 Kx=KRB5     Au=KRB5 Enc=3DES(168) Mac=SHA1
CentOS7.6 OpenSSL 1.0.2k-fips環境下で構築したftpに接続してみると、
TLSv1.2となる
# openssl s_client -connect localhost:21 -starttls ftp
CONNECTED(00000003)
depth=0 C = JP, L = Default City, O = Default Company Ltd, CN = kowloonet.local
verify error:num=18:self signed certificate
verify return:1
depth=0 C = JP, L = Default City, O = Default Company Ltd, CN = kowloonet.local
verify return:1
---
Certificate chain
 0 s:/C=JP/L=Default City/O=Default Company Ltd/CN=kowloonet.local
   i:/C=JP/L=Default City/O=Default Company Ltd/CN=kowloonet.local
---
Server certificate
-----BEGIN CERTIFICATE-----
・
・
-----END CERTIFICATE-----
subject=/C=JP/L=Default City/O=Default Company Ltd/CN=kowloonet.local
issuer=/C=JP/L=Default City/O=Default Company Ltd/CN=kowloonet.local
---
No client certificate CA names sent
Client Certificate Types: RSA sign, DSA sign, ECDSA sign
Requested Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
Shared Requested Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 1663 bytes and written 437 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 
・
・
---
ciphers表示
# openssl ciphers -v | sort
表示結果は割愛
ciphers ECDHEのみ表示
# openssl ciphers -v | grep ECDHE | sort
ECDHE-ECDSA-AES128-CCM  TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESCCM(128) Mac=AEAD
ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(128) Mac=AEAD
ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA256
ECDHE-ECDSA-AES128-SHA  TLSv1 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA1
ECDHE-ECDSA-AES256-CCM  TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESCCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-SHA  TLSv1 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA1
ECDHE-ECDSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=CHACHA20/POLY1305(256) Mac=AEAD
ECDHE-PSK-AES128-CBC-SHA256 TLSv1 Kx=ECDHEPSK Au=PSK  Enc=AES(128)  Mac=SHA256
ECDHE-PSK-AES128-CBC-SHA TLSv1 Kx=ECDHEPSK Au=PSK  Enc=AES(128)  Mac=SHA1
ECDHE-PSK-AES256-CBC-SHA TLSv1 Kx=ECDHEPSK Au=PSK  Enc=AES(256)  Mac=SHA1
ECDHE-PSK-CHACHA20-POLY1305 TLSv1.2 Kx=ECDHEPSK Au=PSK  Enc=CHACHA20/POLY1305(256) Mac=AEAD
ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA256
ECDHE-RSA-AES128-SHA    TLSv1 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA1
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-SHA    TLSv1 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA1
ECDHE-RSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH     Au=RSA  Enc=CHACHA20/POLY1305(256) Mac=AEAD

【Linux】vi操作メモ

vimの設定

vim設定
# vi ~/.vimrc
set tabstop=2
set shiftwidth=2
set smartindent
set expandtab
# source ~/.vimrc
tabstopタブ幅をスペースn分で読み込み
shiftwidthタブ幅をスペースn分で作成
smartindent自動インデント
expandtabタブを半角スペースで挿入

vim拡張子の関連付け

vim設定
# echo 'autocmd BufNewFile,BufRead *.vue set filetype=php' >> ~/.vimrc
# vi test.vue
: source ~/.vimrc

カーソルの移動

上下左右h j k l
単語の先頭w
前の単語の先頭b
単語の末尾e
前の単語の末尾ge
段落の移動{ }
行の先頭^
行の末尾$
ファイルの先頭gg
ファイルの末尾G
画面スクロール下Ctrl+F
画面スクロールCtrl+B

CentOS8でサーバー構築 - 5.バーチャルホスト・BASIC認証の設定(Apache2.4)

バーチャルホスト
 dev.kowloonet.local
ドキュメントルートは
 /home/dev
で設定する。
DNSは内部向けにBINDで dev.kowloonet.local でアクセスできるようにしてあります。
独自ドメインを取得していて外部のDNSサーバーを利用している場合は
コントロールパネルなどから設定が必要です。
CentOS8でサーバー構築 - 4.内部向けDNSサーバー(BIND)

バーチャルホストの設定

未定義バーチャルホストの接続を拒否
# vi /etc/httpd/conf.d/virtualhost-00.conf
<VirtualHost _default_:80>
    ServerName any
    <Location />
        Require all denied
    </Location>
</VirtualHost>
バーチャルホスト設定
# vi /etc/httpd/conf.d/virtualhost-dev.conf
<VirtualHost *:80>
    ServerName dev.kowloonet.local
    DocumentRoot /home/dev
    <Directory /home/dev>
      Options FollowSymLinks
      DirectoryIndex index.html index.php
      AllowOverride All
      Require all granted
    </Directory>
</VirtualHost>
Apache再起動
# systemctl restart httpd

BASIC認証の設定

先程追加したバーチャルホストに対してBASIC認証をかける。
バーチャルホスト追加
# vi /etc/httpd/conf.d/virtualhost-dev.conf
<VirtualHost *:80>
    ServerName dev.kowloonet.local
    DocumentRoot /home/dev
    # Auth Basic
    <Directory /home/dev>
      Options FollowSymLinks
      DirectoryIndex index.html index.php
      AllowOverride All
      AuthType Basic
      AuthName "Basic Authentication"
      AuthUserFile /etc/httpd/conf/.htpasswd_dev
      require valid-user
    </Directory>
</VirtualHost>
htpasswdファイル作成(新規で作成)
# htpasswd -c /etc/httpd/conf/.htpasswd_dev ユーザ名
New password:
Re-type new password:
Adding password for user ユーザ名
htpasswdファイル作成(ユーザを追加)
# htpasswd /etc/httpd/conf/.htpasswd_dev ユーザ名
Apache再起動
# systemctl restart httpd
ログファイルを別にしたい場合
<VirtualHost *:80>
    ServerName dev.kowloonet.local
    DocumentRoot /home/dev
    ErrorLog logs/dev.kowloonet.local-error_log
    CustomLog logs/dev.kowloonet.local-access_log combined env=!no_log
    <Directory /home/dev>
      Options FollowSymLinks
      DirectoryIndex index.html index.php
      AllowOverride All
      Require all granted
    </Directory>
</VirtualHost>

TeraTermのマクロ - 自動でROOTログイン

パスワード形式での認証

username = 'ユーザー名'
hostname = '192.168.128.100'
pass = 'ユーザのパスワード'
rootpass = 'ルートのパスワード'
port = '22'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

msg = hostname
strconcat msg ':port /ssh /2 /auth=password /user='
strconcat msg username
strconcat msg ' /passwd='
strconcat msg pass

connect msg

wait username
varCmd = 'su -'
sendln varCmd
wait 'Password:'
sendln ROOTPASS

【Wordpress】カスタムフィールドでソート・日付範囲指定

日付でソートしてその年以降の記事のみ表示

ユーザが設定したカスタムフィールド「schedule_date」でソートして、
現在の年より過去の記事は表示させないようにする。
「schedule_date」は Ymd の8桁の文字列。
ソートには
'orderby' => 'meta_value'
'order' => 'ASC/DESC',
'meta_key' => 'ソート対象のフィールド名',
で指定する。
条件判定は meta_query を使う。
<?php
$posttype = 'schedule';

$args = array(
  'posts_per_page' => -1,
  'post_type' => $posttype,
  'post_status' => 'publish',
  'orderby' => 'meta_value',
  'order' => 'ASC',
  'meta_key' => 'schedule_date',
  'meta_query' => array('key' => 'schedule_date',
    'value' => date('Y').'0101',
    'compare' => '>=',
    'type' => 'DATE'
  ),
);

$the_query = new WP_Query($args);

日付でソートしてその年の記事のみ表示

範囲指定の条件が2個以上の場合は relation を使う。
<?php
$posttype = 'schedule';

$args = array(
  'posts_per_page' => -1,
  'post_type' => $posttype,
  'post_status' => 'publish',
  'orderby' => 'meta_value',
  'order' => 'ASC',
  'meta_key' => 'schedule_date',
  'meta_query' => array(
    'relation' => 'AND',
    array(
      'key' => 'schedule_date',
      'value' => date('Y').'0101',
      'compare' => '>=',
      'type' => 'DATE'
    ),
    array(
      'key' => 'schedule_date',
      'value' => date('Y').'1231',
      'compare' => '<=',
      'type' => 'DATE'
    )
  )
);

$the_query = new WP_Query($args);

CentOS8でサーバー構築 - 4.内部向けDNSサーバー(BIND)

ローカルネットワーク内に立てたサーバーは、そのままではIPアドレス
http://192.168.1.100
などででしかアクセスできない。
これだと開発するのにしても何かと不都合なので、
内部向けにドメイン名でもアクセスできるようにしておく。
Gateway192.168.128.1
サーバーIPアドレス192.168.128.100
サーバードメインkowloonet.local
メールドメインmail.kowloonet.local
追加ドメインwww.kowloonet.local
追加ドメインdev.kowloonet.local
昔Pentium3のGatewayのPC使ってたわ。。

BINDのインストール

インストール
# yum -y install bind bind-utils
設定
# vi /etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
options {
        listen-on port 53 { 127.0.0.1; 192.168.128.0/24;};
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        secroots-file   "/var/named/data/named.secroots";
        recursing-file  "/var/named/data/named.recursing";
        allow-query     { localhost; 192.168.128.0/24;};

        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */
        recursion no;

        dnssec-enable yes;
        dnssec-validation yes;

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";

        /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
        include "/etc/crypto-policies/back-ends/bind.config";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

/*
zone "." IN {
        type hint;
        file "named.ca";
};
*/

zone "kowloonet.local" IN {
       type master;
       file "kowloonet.local.zone";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
ゾーンファイル作成
# vi /var/named/kowloonet.local.zone
$TTL    86400

@       IN      SOA     kowloonet.local. root.kowloonet.local.    (
        2016050204
        3600
        900
        604800
        86400
)

               IN      NS     kowloonet.local.
               IN      MX     10 mail
               IN      A      192.168.128.100
www      IN      A      192.168.128.100
mail     IN      A      192.168.128.100
dev      CNAME      www
named.conf確認
# named-checkconf
ゾーンファイル確認
# named-checkzone kowloonet.local /var/named/kowloonet.local.zone
zone kowloonet.local/IN: loaded serial 2016050204
OK
起動
# systemctl start named
# systemctl enable named
Created symlink /etc/systemd/system/multi-user.target.wants/named.service → /usr/lib/systemd/system/named.service.

DNSの設定

resolv.confを修正し、先程設定したDNSサーバーを設定。
NetworkManagerがresolv.confを自動で生成・上書きするのを止めておきます。
DNSサーバのIPアドレス設定
# vi /etc/resolv.conf
# Generated by NetworkManager
search local
nameserver 192.168.128.100
nameserver 192.168.128.1
※nameserver は必ず内部向けDNSサーバーのアドレスを先に書く事
逆だと機能しませんでした。
NetworkManageの設定
# vi /etc/NetworkManager/NetworkManager.conf
・
・
[main]
#plugins=ifcfg-rh,ibft
dns=none
NetworkManageの再起動
# systemctl restart NetworkManager

ドメインが認識されるかの確認(サーバーから)

サーバー(192.168.128.100)でドメインが認識できるか確認。
確認
# ping -c 4 www.kowloonet.local
PING www.kowloonet.local (192.168.128.100) 56(84) bytes of data.
64 bytes from kowloonet.local (192.168.128.100): icmp_seq=1 ttl=64 time=0.069 ms
64 bytes from kowloonet.local (192.168.128.100): icmp_seq=2 ttl=64 time=0.053 ms
64 bytes from kowloonet.local (192.168.128.100): icmp_seq=3 ttl=64 time=0.052 ms
64 bytes from kowloonet.local (192.168.128.100): icmp_seq=4 ttl=64 time=0.055 ms

--- www.kowloonet.local ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 82ms
rtt min/avg/max/mdev = 0.052/0.057/0.069/0.008 ms

# ping -c 4 dev.kowloonet.local
PING www.kowloonet.local (192.168.128.100) 56(84) bytes of data.
64 bytes from kowloonet.local (192.168.128.100): icmp_seq=1 ttl=64 time=0.023 ms
64 bytes from kowloonet.local (192.168.128.100): icmp_seq=2 ttl=64 time=0.052 ms
64 bytes from kowloonet.local (192.168.128.100): icmp_seq=3 ttl=64 time=0.049 ms
64 bytes from kowloonet.local (192.168.128.100): icmp_seq=4 ttl=64 time=0.049 ms

--- www.kowloonet.local ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 32ms
rtt min/avg/max/mdev = 0.023/0.043/0.052/0.012 ms

ドメインが認識されるかの確認(クライアントから)

同じネットワーク内にあるクライアントPC(192.168.128.101等)から
ドメインが認識できるか確認する。
WindowsのDNSサーバー変更
コントロールパネルなどから現在使用している接続のプロパティを表示させてDNSサーバーを追加。
(コントロール パネル→ネットワークとインターネット→ネットワークと共有センター 接続:)
ネットワークのプロパティで「インターネットプロトコルバージョン4(TCP/IPv4)のプロパティ」で、
DNSサーバーに 192.168.128.100 を追加する。
※優先DNSサーバーに内部向けDNSサーバーのアドレスを先に書く事
コマンドプロンプトで確認
>ping www.kowloonet.local

www.kowloonet.local [192.168.128.100]に ping を送信しています 32 バイトのデータ:
192.168.128.100 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.128.100 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.128.100 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.128.100 からの応答: バイト数 =32 時間 <1ms TTL=64

192.168.128.100 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 0ms、平均 = 0ms

>ping dev.kowloonet.local

www.kowloonet.local [192.168.128.100]に ping を送信しています 32 バイトのデータ:
192.168.128.100 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.128.100 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.128.100 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.128.100 からの応答: バイト数 =32 時間 <1ms TTL=64

192.168.128.100 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 0ms、平均 = 0ms