WordPressにお問合せフォームを作る

環境

WordPress 4.9.1
Contact Form 7 4.9.2
WP Mail SMTP 1.2.2


WordPressの固定ページにお問合せフォームを作成し、
問い合わせがあった場合はメールを飛ばします。
なお、利用するメールサーバは外部のメールサーバとします。

構築手順

■プラグインのインストール

以下のプラグインをインストールし、有効化します。

  • Contact Form 7
  • WP Mail SMTP

※『Contact Form 7』は類似プラグインで『Contact Form7』(7の前にスペース無し)もあるので注意。

■お問合せフォームの設定

インストール済みプラグイン一覧画面にて「Contact Form 7」の設定を選択します。

フォーム一覧画面が表示され、「コンタクトフォーム1」というフォームが自動で作られているので「編集」を選択する。

ここでフォーム名やフォームの内容を編集できる。

各タブの内容は以下の通りです。

  • フォーム
    • WEB画面で表示するフォームの内容を設定できます
      アスタリスクを付けると必須項目になります
  • メール
    • フォームに入力された際に送信するメールに関する設定
      送信元については後工程の「WP Mail SMTP」の設定にて実施するので設定不要です
  • メッセージ
    • フォームを入力した際に画面上で表示するメッセージ
  • その他の設定
    • 細かいカスタマイズもできるようだが、ここでは割愛します

また、フォーム一覧画面に記載されている「ショートコード」は最終的に固定ページに埋め込むので控えておいてください。

■メールサーバの設定

インストール済みプラグイン一覧画面にて「WP Mail SMTP」の設定を選択します。

※左メニューより『設定 > WP Mail SMTP』と選択しても良いです。

送信元アドレス、送信者名を適宜入力し、メーラーは環境にあったものを選んでください。
メーラーがよく分からなければ「Other SMTP」(よくあるメールサーバのホスト名とかを指定する方式)を選択すれば良いです。

あとは選んだメーラーに依って違う詳細設定項目が下に現れるので、そこを入力して『Save Settings』をクリックすれば設定完了です。

■固定ページの作成

手順「お問合せフォームの設定」にて控えておいたショートコードを固定ページに記載するだけです。
必要に応じてdivタグで括ったりヘッダーを付けるなどの装飾をしてください。

以上で問い合わせフォームの作成は完了です。

【CentOS】OpenVPN & LDAPでVPNサーバ構築

環境

CentOS 7.4
OpenVPN 2.4.4

参考サイト

ServerWorldさん:https://www.server-world.info/query?os=CentOS_7&p=openvpn
cloudpackさん:https://cloudpack.media/73

※前提条件

LDAPサーバは既に構築済みとします


サーバ作業手順

■インストール

必要なものをインストールします。

yum --enablerepo=epel install openvpn openvpn-auth-ldap easy-rsa net-tools bridge-utils

■各種証明書生成

easy-rsaのディレクトリに移動し、各種証明書を生成します。

cd /usr/share/easy-rsa/2.0 

CA 証明書

まず、varsファイルを修正します。

vim vars

内容は以下の通りです。(コメント行・空行は除外しています)

export EASY_RSA="`pwd`"
export OPENSSL="openssl"
export PKCS11TOOL="pkcs11-tool"
export GREP="grep"
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
export KEY_DIR="$EASY_RSA/keys"
export PKCS11_MODULE_PATH="dummy"
export PKCS11_PIN="dummy"
export KEY_SIZE=2048
export CA_EXPIRE=3650
export KEY_EXPIRE=3650
export KEY_COUNTRY="JP"         #国
export KEY_PROVINCE="Tokyo"     #都道府県
export KEY_CITY="Shibuya-ku"    #市区町村
export KEY_ORG="AAA-Company"    #組織名
export KEY_EMAIL="fooo@aaa.com" #メールアドレス
export KEY_OU="BTeam"           #チーム名など(任意)
export KEY_NAME="EasyRSA"

CA証明書を生成します。

source ./vars
./clean-all
./build-ca
〜色々聞かれるが全てそのままエンターで良さそう〜

サーバー証明書

サーバ証明書を生成します。

./build-key-server server
〜色々聞かれるが基本的にはそのままエンターで良さそう〜
〜途中でYes/Noを聞かれるので、そこは「y」と入力する〜

Diffie Hellman(DH)

DHを生成します。

./build-dh

各種証明書の移動

OpenVPNのディレクトリに生成した証明書達を移動します。

cp keys/ca.crt /etc/openvpn/.
cp keys/server.crt /etc/openvpn/.
cp keys/server.key /etc/openvpn/.
cp keys/dh2048.pem /etc/openvpn/.

■OpenVPN設定

OpenVPNのサーバ設定をします。

cp /usr/share/doc/openvpn-2.4.4/sample/sample-config-files/server.conf /etc/openvpn/server.conf
vim /etc/openvpn/server.conf

内容は以下の通りです。(コメント行・空行は除外しています)

port 1194
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
server 192.168.10.0 255.255.255.0        #OpenVPNサーバのサブネットマスク
route 192.168.10.0 255.255.255.0         #クライアントに割り振るサブネットマスク=serverと同じで良い
push "redirect-gateway def1"             #クライアントは全ての通信をVPN経由にする
push "dhcp-option DNS 192.168.10.254"    #DNSサーバの設定
keepalive 10 120
status /var/log/openvpn-status.log
log         /var/log/openvpn.log
log-append  /var/log/openvpn.log
verb 3
plugin    /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so "/etc/openvpn/auth/ldap.conf"
client-cert-not-required
username-as-common-name

LDAPサーバへの接続設定もします。

vim /etc/openvpn/auth/ldap.conf

内容は以下の通りです。(コメント行・空行は除外しています)

<LDAP>
    URL     ldap://ldap.sample.com   #LDAPサーバへのURL
    Timeout     15
    TLSEnable   no
    FollowReferrals yes
</LDAP>
<Authorization>
    BaseDN      "ou=People,dc=sample,dc=com" #LDAPサーバのログインアカウント情報のDN
    SearchFilter    "(&(uid=%u))"
    RequireGroup    false
</Authorization>

■iptable設定

VPN接続してきたクライアントがVPNサーバ経由で外部連携するためにはiptableでマスカレードしてあげる必要があります。
openvpn起動時にiptable設定ができるようスクリプトを作っておきます。

起動スクリプト

#!/bin/bash

# 設定クリア
/etc/openvpn/openvpn-shutdown

# マスカレード設定(IPアドレスや利用するイーサネット等のIFは環境に合わせて変更)
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eno1 -j MASQUERADE

# VPNサーバからの送信許可設定
iptables -I OUTPUT -o tun+ -j ACCEPT
iptables -I FORWARD -o tun+ -j ACCEPT

停止スクリプト

#!/bin/bash

# iptablesルール削除関数
delete() {
    rule_number=`iptables -L $target --line-numbers -n -v|grep tun.|awk '{print $1}'|sort -r`
    for num in $rule_number
    do
        iptables -D $target $num
    done
}

# 受信ルール削除
target='INPUT'
delete

# 転送ルール削除
target='FORWARD'
delete

# 送信ルール削除
target='OUTPUT'
delete

■起動

systemctl start iptables
systemctl start openvpn
sh /etc/openvpn/openvpn-startup

クライアント作業手順

■Tunnelblinkの取得

以下サイトよりダウンロード&インストールします。  
https://tunnelblick.net/downloads.html  

■VPN設定

サーバ側で生成したca.crtをクライアント側にダウンロードし、その同じディレクトリにsample.ovpnを作成します。
※上記「sample」部分については任意の名前にしてください。それがTunnelblink上での接続先名になります。

sample.ovpnの中身は以下のようにしてください。

client

auth-user-pass

dev    tun
proto  tcp

ca     ca.crt

remote xxx.xxx.xxx.xxx 1194 #xxxはクライアントからVPNサーバへアクセスする際のIPアドレス

この作成したovpnファイルをダブルクリックで開くとTunnelblinkが起動し、VPN設定がされる。

■VPN接続

Tunnelblinkを起動し、上部常駐アイコンより「sampleに接続」を選択すると接続できる。

Visual Studio CodeでPHP開発環境構築

■環境

macOS High Sierra 10.13.1
Visual Studio Code 1.19.0


■Visual Studio Codeの取得

Visual Studio Code(以下、VSCode)本体をダウンロードします。
https://www.microsoft.com/ja-jp/dev/products/code-vs.aspx

ダウンロードしてきたzipを回答するとアプリケーションファイル(.app)が出てくるので、アプリケーションディレクトリへ移動しておきます。

■拡張機能インストール

VSCodeを起動したら上部メニューより表示 > 拡張機能を選択します。
もしくは左側にあるアイコンの中の一番下にある四角いアイコンを選択します。

検索窓が表示されるので、キーワード検索をしてインストールすることが可能です。
以下、私がインストールしてみたものです。

Project Manager

プロジェクト管理をするための拡張機能です。
現在開いているワークスペースをプロジェクトとして保存しておくことで
プロジェクトの切り替えが簡単になります。
NetBeansやEclipseのように複数プロジェクトを同時に開いておくことはできないようです。

■使い方
上部メニューの表示 > コマンドパレットを開き、検索バーにProject Managerと入力するとProject Manager用のコマンドが表示されます。

(コマンドパレットはCommand + Shft+Pでも開けます)

主に使うコマンドについては以下の通り。

コマンド 内容
Save Project 現在のワークスペースをプロジェクトとして保存
Edit Project 保存済みプロジェクトの編集
List Project to Open 保存済みプロジェクト一覧を表示し、選択したプロジェクトを開く

ftp-simple

ファイルやディレクトリをサーバへアップロードしたりダウンロードするための拡張機能。
FTPだけでなく、SFTPも使えます。

■使い方
コマンドパレットに「ftp-simple」と入れれば候補がでます。
コマンドパレットについては上記「Project Manager」と同様なので割愛。

主に使うコマンドについては以下の通り。

コマンド 内容
Config サーバ連携の設定
Save サーバへのファイル・ディレクトリアップロード
Download サーバからのファイル・ディレクトリダウンロード
Diff ローカルとサーバーの差分を表示する
Delete サーバー上のファイル・ディレクトリを削除する

PHP IntelliSense

PHPのハイライトや補完機能を追加する拡張機能。
インストールするだけで良いです。

Path Intellisense

ディレクトリパスを入力する際に自動で補完してくれる拡張機能。
これもインストールするだけで良いです。

Bracket Pair Colorizer

相対する括弧が同じ色となるので、どこからどこまでが括弧で囲われているか分かりやすくなります。
若干エディタがカラフルになり過ぎるので、人によっては嫌いかも。
これもインストールするだけで良いです。

■設定周り

ファイル拡張子毎の言語設定

ファイルの拡張子を通常ではないものにしている場合、ハイライトや補完機能が使えない場合があります。
その場合は対象のファイルを開いた状態で右下の「プレーンテキスト」をクリックします。

※既に他の言語が紐づいている場合は、その言語が表示されていると思います。

すると言語の設定画面が開きます。
同じ拡張子のファイル全てに反映させたい場合は検索バーの下にある「’.xxx’に対するファイルの関連付けの構成」をクリックします。

ここで言語を設定すれば、今後は選択した言語のハイライトなどが反映されるようになります。

【git】ローカルとリモートのブランチを削除するスクリプト

マージ済みのブランチを削除する時に、いつもローカルブランチとリモートブランチの両方を削除するのが面倒だったのでスクリプト化しました。

リモートはorigin限定です。
git_del_br.shという名前で作った例です。

#!/bin/bash
set +eu

if [ $# -eq 1 ]; then
    # delete local branch
    loBrCheck=`git branch | grep "^[ ]*${1}\$"`
    if [ ${#loBrCheck} -gt 0 ]; then
        echo "delete local branch."
    git branch -D $1;
    fi

    # delete remote branch
    reBrCheck=`git branch -a | grep "^[ ]*remotes/origin/${1}\$"`
    if [ ${#reBrCheck} -gt 0 ]; then
        echo "delete remote branch"
        git push --delete origin $1;
    fi
else
    echo
    echo "##################################"
    echo " Usage: git_del_br.sh [branch name]"
    echo "##################################"
    echo
fi

【CentOS】侵入検知したらSlack通知する

■環境

CentOS 7.4
AIDE 0.15.1


AIDEという侵入検知ツールを導入し、検査結果をSlackに通知するようにします。

AIDEインストール

yum install -y aide

AIDE設定

vim /etc/aide.conf

95行目辺りより監視対象ディレクトリの設定があります。
設定値の記載方法は以下の通り。

/{DIR_PATH}/ {CHECK_METHOD} #監視対象に含める
!/{DIR_PATH}/ #監視対象から除外する

上記の『DIR_PATH』の部分に対象のディレクトリパスを記載し、
『CHECK_METHOD』に監視方法を記載します。

監視方法については本設定ファイルの95行目以前に記載があるので、そちらを参照してください。
とりあえずAIDE 0.15.1では「CONTENT_EX」にしておくのが無難そうです。

監視対象の設定が完了したら、AIDEのデータベースを初期化します。
※以下コマンド実行後、結構待ちます。

aide -i

自動監視設定

AIDEでスキャンを実行し、結果をSlack通知するスクリプトを作成します。
仮に、/opt/aide_scan.shという名前で作るとします。

vim /opt/aide_scan.sh

シェルスクリプトの中身は以下のようにします。

#!/bin/bash
set +e

##### Settings
## AIDE
LOGFILE="/var/log/aide/aide.log"
AIDEDIR="/var/lib/aide"
## Slack
URL="https://hooks.slack.com/services/AAAAAAAA/BBBBBBBB/CCCCCCCC"
TO="#aide"
EMOJI=":cop:"
NAME="AIDE-COP"

##### Run AIDE Scan
/usr/sbin/aide  -u > $LOGFILE
cp $AIDEDIR/aide.db.new.gz $AIDEDIR/aide.db.gz
x=$(grep "Looks okay" $LOGFILE | wc -l)
if [ $x -eq 1 ]; then
    MSG="OKだよ"
else
    MSG="侵入検知!詳細は[${LOGFILE}]を見てね"
fi

##### Send To Slack
payload="payload={\"channel\": \"${TO//\"/\\\"}\", \"username\": \"${NAME//\"/\\\"}\", \"text\": \"${MSG//\"/\\\"}\", \"icon_emoji\": \"${EMOJI}\"}"
curl -m 30 --data-urlencode "${payload}" $URL -A 'zabbix-slack-alertscript / https://github.com/ericoc/zabbix-slack-alertscript'

スクリプトの設定項目は以下の通りです。

項目 内容
LOGFILE AIDEの検査結果を出力するログファイルです。
AIDEDIR AIDE本体のディレクトリです。aide.confの設定に合わせてください。
URL Slackの『Incoming WebHooks』のURLです。詳細はコチラ
TO メッセージを送るSlackのチャンネル
EMOJI Slack上で表示される絵文字
NAME Slack上で表示される名前

作成したスクリプトを1日1回cronで回します。
以下はcronの設定例です。

0 10 * * * /bin/sh /opt/aide_scan.sh > /dev/null 2>&1

これで1日1回AIDEが侵入検知してくれるようになります。

【Mac】PCの起動・停止時刻を出力するシェルスクリプト

■環境

macOS High Sierra 10.13.1
bash 4.4.12


職場の勤怠を付ける際に数日分まとめて入力するのですが、
出勤退勤時刻の目安とするため、Macの起動・停止時刻を出すようにしました。

まず、このシェルスクリプトはbash Ver 4.x.x台以上でないと動かないので、
bashのバージョンが3の場合はHomebrewでインストールします。
※執筆時点でMacにデフォルトで入っているbashはVer 3.x.xでした。

$ brew install bash
$ which bash
/usr/local/bin/bash

シェルスクリプトを作成します。
仮でホームディレクトリ直下に「kintai.sh」という名前で作る事にします。

$ vim ~/kintai.sh

シェルの内容は以下の通りです。
シバン(1行目のやつ)のパスは上記のwhichコマンドで確認したbashのパスとします。

#!/usr/local/bin/bash
set +e

declare -A rebootTimes
declare -A shutdownTimes

shutdownList=`last | grep "^shutdown" | cut -d " " -f 28-33`
while read line;
do
    curdate=`env LANG=eu_US.UTF-8 date -j -f "%a %b %d %H:%M" "${line}" "+%Y/%m/%d"`
    curtime=`env LANG=eu_US.UTF-8 date -j -f "%a %b %d %H:%M" "${line}" "+%H:%M"`
    if [ ${#shutdownTimes[${curdate}]} -eq 0 ]; then
        shutdownTimes[${curdate}]=${curtime}
    fi
done << END
$shutdownList
END

rebootList=`last | grep "^reboot" | cut -d " " -f 30-35`
while read line;
do
    curdate=`env LANG=eu_US.UTF-8 date -j -f "%a %b %d %H:%M" "${line}" "+%Y/%m/%d"`
    curtime=`env LANG=eu_US.UTF-8 date -j -f "%a %b %d %H:%M" "${line}" "+%H:%M"`
    rebootTimes[${curdate}]=${curtime}
done << END
$rebootList
END

firstDate=`date +"%Y/%m/01"`
today=`date +"%d"`

firstDate="2017/12/01"

for ((i=0; i < ${today}; i++)); do
    target=`date -v+${i}d -j -f "%Y/%m/%d" "${firstDate}" +"%Y/%m/%d"`
    echo "${target} : ${rebootTimes[${target}]} - ${shutdownTimes[${target}]}"
done

あとはこのシェルに実行権限をつけて実行するだけです。

$ chmod +x ~/kintai.sh
$ ~/kintai.sh
2017/12/01 : 10:14 - 19:16
2017/12/02 :  -
2017/12/03 :  -
2017/12/04 : 10:10 - 20:01
2017/12/05 : 10:06 - 18:44
2017/12/06 : 09:48 - 18:21
2017/12/07 : 11:22 - 15:18
2017/12/08 : 09:47 - 19:07
2017/12/09 :  -
2017/12/10 :  -
2017/12/11 : 10:06 - 19:53
2017/12/12 : 10:12 -

起動時刻はその日に最初に起動した時刻、停止時刻はその日最後に停止した時刻を出力しています。
日を跨いで仕事をした場合は、どうしようもないです。

Dockerチートシート

DockerHubにログイン

まずこれをしておかないとDockerHubにて公開されているイメージを取ってこれない。
※要DockerHubアカウント

docker login

Dockerイメージ作成

Dockerfileからイメージを作成する。
Dockerfileの作り方そのものは割愛。

docker build --no-cache=true -t {好きなイメージ名} {Dockerfileがあるディレクトリパス}

現在ローカルにあるイメージ確認

docker images

イメージからコンテナ作成

docker run -itd -h {好きなホスト名} -v {ホストのディレクトリ}:{コンテナのディレクトリ} --name {好きなコンテナ名} -p {ホスト側ポート}:{コンテナ側ポート} {イメージ名} {実行コマンド}

■補足
【vオプション】
ホストのディレクトリとコンテナのディレクトリを共有するオプション
例えば-v /home:/homeとすると、ホストのhomeディレクトリとコンテナのhomeディレクトリの中身が同期される。

【pオプション】
ホスト側にどのポートにアクセスがあった場合、コンテナのどのポートに流すかを設定する。
例えば-p 80:80とすればホストの80ポートへのアクセスはコンテナの80ポートへ流れる。 
複数ポートを設定したい場合は-p 80:80 -p 443:443のように複数指定する事も可能。

また、ホスト側が複数IPアドレスを持っている場合などに-p 192.168.1.1:80:80のようにIPアドレスを指定する事も可能。

【実行コマンド】
Dockerfileにて実行コマンドを指定していた場合は省略可能。 
特定のコマンドを実行したい訳でない場合は/bin/bashを指定しておくと無難。 

コンテナ一覧を確認する

docker ps -a

-aオプションをつけないと停止しているコンテナは表示されない。

ホストからコンテナに入る

docker exec -it {コンテナ名} {実行シェル}

■補足
【実行シェル】
どのシェルでログインしたいか。  
分からなければbashにしておくと無難。

コンテナを停止する

docker stop {コンテナ名}

コンテナを起動する

docker start {コンテナ名}

コンテナを削除する

コンテナが停止している状態で以下を実行。

docker rm {コンテナ名}

ローカルのイメージを削除する

該当イメージを利用しているコンテナが存在しない状態で以下を実行。

docker rmi {イメージ名}

コンテナをバックアップする

docker export {コンテナ名} > {任意バックアップ名}.tar

バックアップからコンテナをリストアする

コンテナのリストアは、バックアップしたコンテナのイメージを作成するということ。
作成したイメージからコンテナを作ればリストアとなる。

cat {バックアップ名}.tar | docker import - {作成するイメージ名}
docker run 〜以下略〜

ホストとコンテナでファイル転送

# ホストからコンテナ
docker cp {コピー元ファイルパス} {コンテナ名}:{コピー先ファイルパス}
# コンテナからホスト
docker cp {コンテナ名}:{コピー元ファイルパス} {コピー先ファイルパス}

【AWS】新規EC2立ち上げ後の作業メモ

環境

AWS EC2
Amazon Linux


セキュリティグループ設定

SSH接続元やHTTP通信元の設定をする。
デフォルトではEC2を立ち上げた際のアクセス元に対してSSH接続が許可されているのみ。

立ち上げたEC2へのSSH接続

以下の通りSSH接続を実施する。
ログインアカウント: ec2-user
秘密鍵: EC2立ち上げ時にダウンロードしたpemファイル
※pemファイルはDL後権限を400にしておくこと。

rootになり、パスワードを変更する。

$ sudo su -
# passwd 

日本時刻にする。(rootのまま実施)

# cp -p /usr/share/zoneinfo/Japan /etc/localtime
# service rsyslog restart
# service crond restart

※localtime変更後はrsyslogとcrondを再起動しないと、ログ出力時刻やcron実行時刻が日本時刻にならない。

【Mac】圧縮解凍ソフトのインストール(Win対応)

■環境

macOS Sierra 10.12.6


Windowsで圧縮したファイルがMacで正常に開けなかったり
Macで圧縮したファイルがWindowsで正常に開けなかったり

そんな時はMac側で以下ソフトを使うと解決します。

Windows → Macの圧縮ファイル連携

『The Unarchiver』というソフトを使って解凍すると正常に解凍できます。
OneDriveからダウンロードした圧縮ファイルの解凍が正常にできない場合にも使えます。

MacのAppStoreで配信されていますので、検索してインストールしてください。
使い方は、解凍したい圧縮ファイルを『The Unarchiver』で開くだけです。

Mac → Windowsの圧縮ファイル連携

『WinArchiver Lite』というソフトを使って圧縮すると、Win側で正常に解凍できます。
こちらもMacのAppStoreで配信されています。

使い方は、圧縮したいファイル・ディレクトリを『WinArchiver Lite』で開く、
または『WinArchiver Lite』を起動しておいて、圧縮したいファイル・ディレクトリを『WinArchiver Lite』のウィンドウに
ドラッグ&ドロップすると、Win対応の圧縮ファイルが生成できます。

【Mac】ForiClientでVPNを繋ぐ

■環境

macOS Sierra 10.12.6
FortiClient 5.6.0.703


■本体のダウンロード & インストール

公式サイトよりインストーラをダウンロードする。
http://www.forticlient.com/downloads

ダウンロードしてきたdmgファイルをダブルクリックするとインストーラが走るので、
あとはインストーラに従えばインストール完了

■VPN設定

FortiClientを起動し、「リモートアクセス > 歯車マーク > 新規接続の追加」をクリックする。

接続先の設定をして、『追加』ボタンをクリックする。

その後、パスワードを入力して『接続』ボタンをクリックすれば接続される。

一度設定しておけば、今後の接続&切断は右上のタスクバーのFortiClientアイコンから実施できる。

※FortiClientアイコンは盾マークの中に、VPN接続時は鍵マーク、VPN切断時は四角いマークとなっている。