本番DBを開発用にマスキング

本番データを、開発環境に落とした後に個人情報部分を書き換えるクエリ。あくまでも開発環境用なので、データマスキングツールを使うまでもないので、簡単なクエリで書き換えるというだけ。以下はPostgreSQLでのサンプル。

1.固定名+連番に書き換え

名前(name)を固定値「試験 太郎」+キー番号にする場合。数値型のキーのcustomer_idを6文字以内(先頭から)の文字列として後ろにつけている。

UPDATE customer SET
 name = '試験 太郎' || CAST(customer_id AS character varying(6))
 WHERE name <> '';

「試験 太郎1」・・・「試験 太郎999999」のような感じ。

2.文字列の一部を書き換え

名前(name)の1文字目、3文字目、5文字目を「〇」に置き換える場合。

UPDATE customer SET
 name =  '〇' || SUBSTR(name, 2, 1) || '〇' || SUBSTR(name, 4, 1) || '〇' || SUBSTR(name, 6)
 WHERE  name <> '';

「山本文左衛門」が「〇本〇左〇門」となる。短い「孫文」のような場合、「〇文〇〇」となるので、まあテストデータなので特に気にしない。

3.電話番号

ハイフンで連結されている電話番号(tel)の市外局番だけはそのままで、残りは「9999-9999」として、「03-9999-9999」というような感じにする。

UPDATE customer SET
 tel =  CAST(SPLIT_PART(tel ,'-', 1) AS character varying(5)) || '-9999-9999'
 WHERE tel <> '';

ハイフンの無い携帯番号(mobile_no)の先頭6文字はそのままで、後ろ5文字を「99999」とする例で、「08012399999」という感じになる。

UPDATE customer SET
 mobile_no = SUBSTR(mobile_no , 1, 6)  || '99999'
 WHERE mobile_no <> '';

4.メールアドレス

ドメインはそのままで、アカウント部分を固定値「test」+キー番号とする場合。

UPDATE customer SET
 mail =  'test' || CAST(id_customer AS character varying(10)) || '@' || CAST(SPLIT_PART(mail ,'@', 2) AS character varying(64))
 WHERE mail <> '';

「yamada_tarou@hogehoge.com」がid_customer=869の場合、「test869@hogehoge.com」となる。

SQLServerExpressの設定

SQLServerExpressインストール後に、最初に構成マネージャー等で設定すること。

1.TCP/IPの有効化

[SQL Server ネットワークの構成] - [SQLEXPRESS のプロトコル]で、[TCP/IP]を右クリックして、[有効にする]に設定。

2.ポートの変更

[TCP/IPのプロパティ] - [IPアドレス]タブで、下の[IP ALL]のポートを任意のポートを設定して、ファイアウォールで指定IPからの接続許可を設定する。

設定後に、 SQLEXPRESSを再起動する。

3.SSMSのインストール

ManageMentStudioをダウロードしてインストールする。

https://docs.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15

「使用できる言語」のところで、「日本語」を選んでダウンロードする。

1)DB復元

ManageMentStudio からDBを復元する方法については、以下。

https://docs.microsoft.com/ja-jp/sql/relational-databases/backup-restore/restore-a-database-to-a-new-location-sql-server?view=sql-server-ver15

2)外部からの接続

外部PCからのDB接続には、saユーザーのログインを許可するか別のログインユーザーを作成する。

SQLServerの[プロパティー]-[セキュリティ]の[サーバ認証]で、[SQL Server認証モード と Windows認証モード]に設定して再起動し、SQLServer認証を有効にする。

接続先は2.で3ポートを変更しているので、ManageMentStudio でポート指定をIPアドレスの後にカンマ区切りで指定する。

4.ODBC設定

古い32Bitサーバーアプリを動かすために、32BitのODBCの設定が必要。

https://docs.microsoft.com/ja-JP/troubleshoot/sql/connect/odbc-tool-displays-32-bit-64-bit

32Bit用のODBCコマンドは以下にある。

c:\Windows\SysWOW64\odbcad32

サーバーでポート指定をすること。

Windowsサーバー設定

VPSでWindowsサーバー追加時に設定ことのメモ

1.リモートデスクトップのポート変更

以下レジストリの値を変更したいポートにする。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber

ファイアウォールに上記ポートについて、指定IP(VPN)からのみ許可する設定を追加して、再起動

2.ファイアウォールの設定

リモートデスクトップ用ポートの許可を追加する。不要な設定は、無効にする。

3. リモートログイン時 のメール通知

3.1 SMTP

1)サーバーマネージャーの「役割と機能の追加」から「SMTPサーバー」を追加

2)サービス「簡易メール転送プロトコル」のスタートアップの種類を「自動」に

3)迷惑メール対策として、追加サーバーのSFPレコードを設定

3.2タスクスケジュラー設定

タスクスケジューラで、[トリガー: ユーザーセッションへの接続時]にメール通知するように設定。以前はタスクスケジューラからメール送信設定できたが、現在は使えないようなので、PowerShellで以下のようなコマンドを組む。

# 使用するSMTPサーバを指定します
$smtp = "127.0.0.1"
# 差出人アドレスを指定します
$from = "admin@XXXXX.com"
# 宛先アドレスを指定します
$to = "yourmail@XXXX.com"
# 件名を指定します
$subject = "Login(xxxxserver)"

# メール送信のためのSmtpClientクラスをインスタンス化
$cli = New-Object Net.Mail.SmtpClient($smtp)

# メール送信のためのMailMessageクラスをインスタンス化
$mail = New-Object Net.Mail.MailMessage($from, $to)
$mail.Subject = $subject
$mail.Body = "Did you login?"
$mail.SubjectEncoding = [System.Text.Encoding]::GetEncoding("ISO-2022-JP")
$mail.BodyEncoding = [System.Text.Encoding]::GetEncoding("ISO-2022-JP")

# メールを送信します
$cli.Send($mail)

タスクスケジューラの[操作]で、以下のように設定する。

  • 操作:プログラムの開始
  • プログラム/スクリプト:powershell.exe
  • 引数の追加:-Command “コマンドファイルのフルパス”

4.WindowsUpdateの手動化

勝手にUpdateされると困るので、sconfigコマンドから、手動更新に変設して、サーバー再起動する。

5.自動ログオン

サービス化されていない古いアプリサーバーのために、起動時に自動ログインするように設定する。

https://docs.microsoft.com/ja-jp/troubleshoot/windows-server/user-profiles-and-logon/turn-on-automatic-logon

上記では、レジストリにパスワードを平文で保存することになるので、以下のAutoLogonツールを入れるほうがいい。

https://docs.microsoft.com/ja-jp/sysinternals/downloads/autologon

6.アプリケーションエラーの通知

タスクスケジューラで、[トリガー:イベント]で、以下の場合にメール通知するように設定。 メールの送信方法は3と同様。

  • ログ:Application
  • ソース:Application Error
  • イベント ID:1000

WordPressのXserverへの移行

お名前.comのレンタルサーバーから、Xserverのレンタルサーバーへ移行した。WordPressの移行については、「WordPress簡単移行」で移行した。

https://www.xserver.ne.jp/manual/man_install_transfer_wp.php

便利で楽にできていいのだが、ただ、一つのサイトだけデータ移行のところで失敗して移行できなかった。

【原因】

プラグインの「Google Map WP」がDBでバイナリデータを使っていて、それが通常方法でdumpした場合には復元できないためエラーとなるよう。

【対応方法】

「WordPress簡単移行」を使いたい場合は、一旦、「Google Map WP」プラグインを削除してから移行して、その後、Xser ver側で再度、プラグインを入れるしかないか。

そうじゃなければ、自分で移行する。

https://www.xserver.ne.jp/manual/man_install_transfer_wordpress.php

その場合、DBバックアップ時には「–hex-blob」オプションを指定すること。

https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html#option_mysqldump_hex-blob

バックアップ設定

以下、バックアップの方針に基づいて、CentOSサーバー間で、バックアップ設定した手順。

0.環境

転送元サーバー:CentOS 8.2

  • ホスト名(例):www.xxservice.com
  • グローバルアドレス(例):222.222.222.222
  • プライベートネットワークアドレス(例):10.10.10.1
  • sshdポート(例):7777
  • バックアップを実行するユーザー(例):appuser

転送先サーバー1:CentOS 7.8

  • ホスト名(例):bak1.xxservice.com
  • プライベートネットワークアドレス(例):10.10.10.200
  • sshdポート(例):8888

転送先サーバー2:CentOS 7.8

  • ホスト名(例):bak2.xxservice.com
  • 転送元サーバーとは別拠点で、プライベートネットワーク未接続
  • sshdポート(例):9999

1.転送先サーバーの設定

バックアップ用ユーザー(例):backupuser

バックアップディレクトリ(例):/home/backupuser/xxservice/

1-1)sshd_configの修正

/etc/ssh/sshd_configの設定が以下となるようにする。

  • ホストベース認証を有効
  • ホストベース認証の既知ホストは、ユーザーディレクトリ下を許可
  • ユーザーディレクトリ下の.shostsを有効にする。
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
HostbasedAuthentication yes
# Change to yes if you don't trust ~/.ssh/known_hosts for HostbasedAuthentication 
IgnoreUserKnownHosts no 
# Don't read the user's ~/.rhosts and ~/.shosts files 
IgnoreRhosts no

後、プライベートネットワークでは逆引きできない。余計なログを出さないようにUseDNSがyesの場合は、noに変更する。

UseDNS no

設定変更後に、設定の読み込み。

$ systemctl reload sshd

1-2)rootユーザーへのスイッチ禁止

/etc/pam.d/suで、以下を設定し、rootユーザへのスイッチを禁止する。

auth required pam_wheel.so use_uid root_only

1-3)バックアップ用ユーザー作成

$ adduser backupuser

1-4)バックアップ用ディレクトリ作成

$ su - backupuser
[backupuser ~]$ mkdir xxservice

1-5)既知ホストの追加

バックアップユーザーで、転送元サーバーにssh接続を試みて、公開鍵を取得して既知ホストに登録する。

※転送先サーバー1の場合
[backupuser ~]$ ssh -p 7777 10.10.10.1

※転送先サーバー2の場合
[backupuser ~]$ ssh -p 7777 www.xxservice.com

既知ホストに追加するかと聞いてくるので、yesで登録すると、~/.ssh/known_hostsに登録される。

ポート番号が入った形で登録されるので、viコマンドで修正する。

※転送先サーバー2の場合、以下のように修正する

[www.xxservice.com]:7777,[222.222.222.222]:7777 (公開鍵) 
↓
www.xxservice.com,222.222.222.222 (公開鍵)

1-6).shostsの設定

viコマンドで、.shostsファイルを作成し、中身は以下とする。転送元サーバーのIPアドレスを設定する。

※転送先サーバー1の場合

10.10.10.1 appuser 

※転送先サーバー2の場合

222.222.222.222 appuser 

パーミッションを変更して、.shostsファイルを見えないようにする。

[backupuser ~]$ chmod 600 .shosts

2.転送元サーバーの設定

2-1)ssh_configの修正

従来はssh_configを直接修正していたが、CentOS 8.2 では、以下ディレクトリにファイル追加するのが作法みたい。

/etc/ssh/ssh_config.d/99-hostbase.confを、以下内容で作成する。

HostbasedAuthentication yes
EnableSSHKeysign yes

2-2)既知ホストの追加と接続確認

以下コマンドで接続し、既知ホストに追加するかと聞いてくるので、yesで登録する。

※転送先サーバー1への接続
[appuser ~]$ ssh -p 8888 -l backupuser 10.10.10.200

※転送先サーバー2
[appuser ~]$ ssh -p 9999 -l backupuser bak2.xxservice.com

問題なければ、無事にログインできる。

2-3)バックアップ処理の登録

以下のコマンドを作成して、実行権を付けて、cron実行する。

2-3-1)バックアップコマンド

do_backupという名前で以下ファイルを作成する。timeコマンドで実行時間を計測しながら、低優先度でバックアップを実行する。

引数は、バックアップサーバーのアドレス、ポート、バックアップファイルの接尾辞で、このコマンドは、バッチから引数を渡されて実行される。

【do_backup】

#!/bin/sh
#
alias dotime='time ionice -c 2 -n 7 nice -n 19'

# param
if [ $# -ne 3 ]; then
  echo "param error!!"
  exit 1
fi
BACKUP_SERVER=$1
BACKUP_SERVER_PORT=$2
BACKUP_SUFFIX=$3

# file setting
BIN_DIR=(コマンドの配置ディレクトリ)
BACKUP_DIR=(バックアップファイルを置くディレクトリ)
BACKUP_LOG="$BACKUP_DIR/bak_$BACKUP_SUFFIX.log"

BACK_FILE_DB="$BACKUP_DIR/dbbak_$BACKUP_SUFFIX"

APP_DIR=(アプリケーションデータのディレクトリ)
BACK_APP_DIR="$BACKUP_DIR/appdata/"

TRNS_DB_DIR="/home/backupuser/xxservice/"
TRNS_APP_DIR="/home/backupuser/xxservice/appdata/"

#--------------------------------------------------
# Start
echo "---- START : `date`"  > $BACKUP_LOG

####################
# DB
echo "---- DB S : `date`"  >> $BACKUP_LOG
(dotime $BIN_DIR/do_db_backup $BACK_FILE_DB &>> $BACKUP_LOG) &>> $BACKUP_LOG

echo "---- DB GZIP S : `date`"  >> $BACKUP_LOG
(dotime gzip -f $BACK_FILE_DB &>> $BACKUP_LOG) &>> $BACKUP_LOG

####################
# APP
echo "---- APP S : `date`"  >> $BACKUP_LOG
(dotime rsync -auv --rsync-path="ionice -c 2 -n 7 nice -n 19 rsync" \
  $APP_DIR $BACK_APP_DIR &>> $BACKUP_LOG) &>> $BACKUP_LOG

####################
# Transfer

# transfer DB backup
echo "---- TRN DB S : `date`"  >> $BACKUP_LOG
(dotime scp -P $BACKUP_SERVER_PORT $BACK_FILE_DB.gz ubackup@$BACKUP_SERVER:$TRNS_DB_DIR \
  &>> $BACKUP_LOG) &>> $BACKUP_LOG

# transfer APP backup
echo "---- TRN APP S : `date`"  >> $BACKUP_LOG
(dotime rsync -auvz -e "ssh -p $BACKUP_SERVER_PORT" $BACK_APP_DIR \
  ubackup@$BACKUP_SERVER:$TRNS_APP_DIR  &>> $BACKUP_LOG) &>> $BACKUP_LOG

# End
echo "---- END : `date`"  >> $BACKUP_LOG

最初のrsyncで、–rsync-path=”ionice -c 2 -n 7 nice -n 19 rsync”オプションを付けているのは、受信側も同じアプリサーバーのため優先度を下げている。転送時には付けていないのは、転送先サーバーはバックアップ専用のため、優先度を気にしなくていいため。

2-3-2)DBバックアップコマンド

do_db_backupという名前で以下ファイルを作成する。3-1)バックアップコマンドから呼ばれるコマンドで、DBに応じたコマンドを作成する。

【do_db_backup】

※MariaDBの例

#!/bin/sh
#
#  $1: backup file name
#

mysqldump --user=(DBユーザー) --password=(DBパスワード) --single-transaction (データベース名) > $1

※PostgreSQLの例

#!/bin/sh
#
#  $1: backup file name
#

pg_dump -Fc -b (データベース名)> $1

2-3-3)実行コマンド

バッチで実行するための、以下の2つのファイルを作成する。

【BACKUP_HOURLY】

#!/bin/sh
#

BACKUP_SERVER=10.10.10.200
BACKUP_SERVER_PORT=8888
BACKUP_SUFFIX=h`date +%H`

(コマンドの配置ディレクトリ)/do_backup \
  $BACKUP_SERVER $BACKUP_SERVER_PORT $BACKUP_SUFFIX

【BACKUP_DAILY】

#!/bin/sh
#

BACKUP_SERVER=bak2.xxservice.com
BACKUP_SERVER_PORT=9999
BACKUP_SUFFIX=d`date +%d`

(コマンドの配置ディレクトリ)/do_backup \
  $BACKUP_SERVER $BACKUP_SERVER_PORT $BACKUP_SUFFIX

2-4)cron設定

“crontab -e”で、実行コマンドをスケジューリングする。

毎時42分と、毎日3時13分にバックアップする設定の例。

# m h dom mon dow command
42 * * * * (コマンドの配置ディレクトリ)/BACKUP_HOURLY
13 3 * * * (コマンドの配置ディレクトリ)/BACKUP_DAILY