【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>

Gmail宛にメールが送信されない件

maillog
Apr  1 07:51:34 kowloonet postfix/smtpd[2696]: disconnect from softbank126200169177.bbtec.                  net[126.200.169.177] ehlo=1 auth=1 mail=1 rcpt=1 data=1 rset=1 quit=1 commands=7
Apr  1 07:51:35 kowloonet postfix/smtp[2699]: 6E1F9C172C: to=, r                  elay=gmail-smtp-in.l.google.com[64.233.189.27]:25, delay=1.5, delays=0.09/0.03/0.85/0.53,                   dsn=5.7.1, status=bounced (host gmail-smtp-in.l.google.com[64.233.189.27] said: 550-5.7.1                   [160.16.139.144      12] Our system has detected that this message is 550-5.7.1 likely uns                  olicited mail. To reduce the amount of spam sent to Gmail, 550-5.7.1 this message has been                   blocked. Please visit 550-5.7.1  https://support.google.com/mail/?p=UnsolicitedMessageErr                  or 550 5.7.1  for more information. 6-20020a630e46000000b003824f9f2affsi710091pgo.451 - gs                  mtp (in reply to end of DATA command))
DNSレコードに下記を追加することで解決。
エントリ名タイプデータTTL
@TXTv=spf1 a:mail.kowloonet.net include:_spf.google.com ~all 3600s
参照: https://support.google.com/a/answer/10684623?hl=ja&ref_topic=10685331

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

この概要は表示できません。投稿を閲覧するには ここをクリック してください。

【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