【CentOS7】 MongoDBを2.6から3系にアップデートする

いろいろと面倒なことはせず、サクッとダンプ&リストアでやっつけます。

バックアップ&古いの削除

service mongod stop
mkdir mddump
mongodump --dbpath /var/lib/mongo ./mddump
mkdir mdbackup
mv /var/lib/mongo ./mdbackup/
yum remove mongo*     

3.2インストール

vi /etc/yum.repos.d/mongodb-org-3.2.repo とし、内容を

[mongodb-org-3.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc

とします。
もっと新しいバージョンにしたい方は https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/ をご参照ください。

yum install mongodb-org mongodb-org-server を実行します。

vi /etc/mongod.conf とし、17行目のコメントを外した上で

engine: wiredTiger

とします。engineという文字列の前に行頭から半角空白が二個入っているようにします。コロンの後ろのスペースも必要です。

リストア

service mongod start
mongorestore ./mddump

以上~

シェルスクリプトをshcを用いてバイナリ化して難読化する

shcはシェルスクリプトを難読化のためにバイナリ化するアプリケーションです。

詳しくはこちら
http://www.datsi.fi.upm.es/~frosal/sources/shc.html

shcのダウンロードとコンパイル

$ wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9b.tgz
$ tar xfzv shc-3.8.9b.tgz
$ cd shc-3.8.9b/
$ make

テスト

vi a.sh

#!/bin/sh
echo "1234hoge#"

./shc -v -f a.sh でコンパイル。
./a.sh.x で動くかどうか確認。
a.sh.xをバイナリエディタで確認し、難読化されているか確認してみてください。

メモ

できあがったa.sh.xはセキュリティのため、他の機材では動かないと思います。
shcに -r オプションをつければ、他の機材でも動くバイナリを作れます。

【modsecurity】auditログにmod_remoteipで取ったipアドレスを記録する

apacheのコードを書き換えます。

方法は2種類あります。とりあえず問題なければ1がおすすめ。

1) ログを書くところで修正

ログに書くところだけ変更するので手軽
apache2/msc_logging.c の1647行目に下記のように変更をかけます。

$ diff modsecurity-2.9.1/apache2/msc_logging.c ../modsecurity-2.9.1/apache2/msc_logging.c
1647c1647
<         current_logtime(msr->mp), msr->txid, msr->remote_addr, msr->remote_port,
---
>         current_logtime(msr->mp), msr->txid, msr->useragent_ip ? msr->useragent_ip : msr->remote_addr, msr->remote_port,

2) remote_addr 変数を取ってくるところで修正

全体に変更がかかるので、検証が必要、かも。ちょっとリスキー。
apache2/mod_security2.c の537行目に下記のように変更をかけます。

$ diff modsecurity-2.9.1/apache2/mod_security2.c ../modsecurity-2.9.1/apache2/mod_security2.c
537c537
<     msr->remote_addr = r->connection->client_ip;
---
>     msr->remote_addr = r->useragent_ip ? r->useragent_ip : r->connection->client_ip;

OpenSSLによる楕円曲線暗号の利用

キー生成

openssl ecparam -genkey -name secp384r1 -out ec-key.pem

リクエスト

openssl req -new -sha256 -key ec-key.pem -subj "/C=JP/ST=State/L=City/O=Org./OU=EC Test Div./CN=test.example.com" -out eccsr.pem

自己署名(したければ)

openssl x509 -req -sha256 -days 3650 -in eccsr.pem -signkey ec-key.pem -out eccsr.ct

pfx(にしたければ)

openssl pkcs12 -export -in eccsr.ct -inkey ec-key.pem -out ec141114.pfx

キーを暗号化する場合

openssl ecparam -genkey -name secp384r1 -out ec-key.pem
openssl ec -in ec-key.pem -aes256 -out enc_ec-key.pem
openssl req -new -sha256 -key enc_ec-key.pem -subj "/C=JP/ST=State/L=City/O=Org./OU=EC Test Div./CN=test.example.com" -out eccsr.pem
openssl x509 -req -sha256 -days 3650 -in eccsr.pem -signkey enc_ec-key.pem -out eccsr.ct

opendkimを設定する

/etc/opendkim/keys/にキー作成

# opendkim-genkey -D /etc/opendkim/keys/

/etc/opendkim.confを編集

確認・変更箇所は以下

Mode  s
LogWhy        no
Domain *
Selector        default
KeyFile /etc/opendkim/keys/default.private
InternalHosts refile:/etc/opendkim/TrustedHosts

当該サーバをメール送信サーバとして他の機器から使う場合、 /etc/opendkim/TrustedHosts に内部ネットワークを記述する。

例)

192.168.100.0/24
192.168.101.0/24

opendkimを再起動

/etc/rc.d/init.d/opendkim restart

DNSに反映

/etc/opendkim/keys/default.txt の内容をdnsサーバに登録する

以上

【Java】 Javaの暗号制限を解除する

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files はJava 9 および Java 8 Update 151以降では不要です。
java.securityファイルを編集し、crypto.policy=unlimitedとします。

例:

# vi /usr/java/jre1.8.0_151/lib/security/java.security
:
(823行目)
#crypto.policy=unlimited
↓ コメントを外す
crypto.policy=unlimited

【CentOS7】 firewalldを利用しているサーバで、特定のポートを公開する / 公開ポートを閉める

80番ポートを空ける

# firewall-cmd --zone=public --add-port=80/tcp --permanent
# firewall-cmd --reload

80番/443番ポートを空ける

# firewall-cmd --zone=public --add-port=80/tcp --permanent
# firewall-cmd --zone=public --add-port=443/tcp --permanent
# firewall-cmd --reload

連続したポートを空ける(例:45000-45300番ポートを空ける)

# firewall-cmd --zone=public --add-port=45000-45300/tcp --permanent
# firewall-cmd --reload

80番ポートを非公開にする

# firewall-cmd --zone=public --remove-port=80/tcp --permanent
# firewall-cmd --reload

80番/443番ポートを非公開にする

# firewall-cmd --zone=public --remove-port=80/tcp --permanent
# firewall-cmd --zone=public --remove-port=443/tcp --permanent
# firewall-cmd --reload

連続したポートを非公開にする(例:45000-45300番ポートを閉める)

# firewall-cmd --zone=public --remove-port=45000-45300/tcp --permanent
# firewall-cmd --reload

【WordPress】 テーマ Twenty Seventeen で横幅を1500pxにし、Blogを1カラムにする

WordPressはyumで入れた(yum install wordpress)ので、 /usr/share/wordpress/wp-content/themes/twentyseventeen/style.css をごりごり書き換えた。

$ diff style.css /usr/share/wordpress/wp-content/themes/twentyseventeen/style.css -u
--- style.css   2018-04-28 13:05:27.000000000 +0900
+++ /usr/share/wordpress/wp-content/themes/twentyseventeen/style.css    2018-04-28 13:55:24.000000000 +0900
@@ -1319,7 +1319,7 @@
 }

 .navigation-top .wrap {
-       max-width: 1000px;
+       max-width: 1500px;
        padding: 0;
 }

@@ -2084,7 +2084,7 @@
 .archive.page-one-column:not(.has-sidebar) #primary {
        margin-left: auto;
        margin-right: auto;
-       max-width: 740px;
+       max-width: 1240px;
 }

 .single-featured-image-header {
@@ -3273,7 +3273,7 @@
        }

        .page-one-column .panel-content .wrap {
-               max-width: 740px;
+               max-width: 1240px;
        }

        .panel-content .entry-header {
@@ -3349,7 +3349,7 @@
        /* Layout */

        .wrap {
-               max-width: 1000px;
+               max-width: 1500px;
                padding-left: 3em;
                padding-right: 3em;
        }
@@ -3458,7 +3458,7 @@
        }

        .navigation-top .wrap {
-               max-width: 1000px;
+               max-width: 1500px;
                /* The font size is 14px here and we need 50px padding in ems */
                padding: 0.75em 3.4166666666667em;
        }
@@ -3822,8 +3822,8 @@
        body.has-sidebar.error404 #primary .page-header,
        body.page-two-column:not(.archive) #primary .entry-header,
        body.page-two-column.archive:not(.has-sidebar) #primary .page-header {
-               float: left;
-               width: 36%;
+               float: none;
+               width: 94%;
        }

        .blog:not(.has-sidebar) #primary article,
@@ -3833,8 +3833,8 @@
        .error404.has-sidebar #primary .page-content,
        body.page-two-column:not(.archive) #primary .entry-content,
        body.page-two-column #comments {
-               float: right;
-               width: 58%;
+               float: none;
+               width: 94%;
        }

        .blog .site-main > article,

【CentOS7】 MySQL InnoDB Cluster の構築

詳しくは https://dev.mysql.com/doc/refman/5.7/en/mysql-innodb-cluster-production-deployment.html をご確認ください。


はじめに

CentOS7サーバを3から4台くらい起動します。
最低3台のDBサーバと一台のルーターサーバが必要です。
ルーターサーバはDBサーバと同居できますが、できれば分離した方が良いでしょう。
そうすると4台が最小構成となります(DBサーバx3台+ルーターサーバx1台)


初期設定

全台ともに
#vi /etc/selinux/config とし

SELINUX=disabled

としてから reboot し、

# yum install -y http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
# yum remove -y mysql-libs

を実行しておきます。


dbサーバの設定

下記の設定を3台かそれ以上のdbサーバに適用してください。

# yum install -y mysql-server mysql-shell
# service mysqld start

$ cat /var/log/mysqld.log | grep temporary とし、出てきたパスワードで mysql -u root -p とします。

SET PASSWORD = "MySQL_5.7";
UNINSTALL PLUGIN validate_password;
SET PASSWORD = "なにがしかのパスワード";
\q

$ mysqlsh とし、

    >dba.configureLocalInstance('root@localhost:3306')

    Please provide the password for 'root@localhost:3306':

    Detecting the configuration file...
    Found configuration file at standard location: /etc/my.cnf
    Do you want to modify this file? [Y|n]:  [Y|n]: Y

    MySQL user 'root' cannot be verified to have access to other hosts in the network.

    1) Create root@% with necessary grants
    2) Create account with different name
    3) Continue without creating account
    4) Cancel
    Please select an option [1]: 2

    account name= clusteradmin
    >\q

# service mysqld restart します。


クラスタの作成

クラスタのうちのどれかから以下を実行します。

$ mysqlsh

    dba.checkInstanceConfiguration('clusteradmin@クラスタ内dbサーバ1のIPアドレス:3306')
    dba.checkInstanceConfiguration('clusteradmin@クラスタ内dbサーバ2のIPアドレス:3306')
    dba.checkInstanceConfiguration('clusteradmin@クラスタ内dbサーバ3のIPアドレス:3306')
    shell.connect('clusteradmin@クラスタ内dbサーバ1のIPアドレス:3306')
    var cluster = dba.createCluster('Cluster001(←クラスタ名、任意の名前でokです)')
    cluster.addInstance('clusteradmin@クラスタ内dbサーバ2のIPアドレス:3306');
    cluster.addInstance('clusteradmin@クラスタ内dbサーバ3のIPアドレス:3306');

クラスタ化されたコンフィグの保存

各dbサーバで修正されたコンフィグをセーブします。
三台かそれ以上のdbサーバすべてで実行してください。

$ mysqlsh

    >dba.configureLocalInstance('clusteradmin@localhost:3306')

スレーブサーバの場合、以下のようになります

    Do you want to disable super_read_only and continue? [y|N]:y

routerサーバの設定

通常、dbサーバではないサーバでrouterを実行します。

# yum install -y mysql-router mysql-shell
$ mysqlrouter --bootstrap clusteradmin@クラスタ1のIPアドレス:3306 --user=mysqlrouter --conf-base-port 3306
# service mysqlrouter start

おまけ

ちゃんと動いてるかどうかテスト

# クラスタ内dbサーバ1が r/w serverになっていると思うので、 rootでログインし、以下のようにします。 本番環境ではadminの接続元を制限し、パスワードを設定してください。
create user admin@'%' identified by 'admin';
grant all on *.* to admin@'%';

# ルーターサーバで以下を実行し、sqlがクラスタ内dbサーバすべてに反映されているか確認します。
$ mysql-shell
mysql-sql> \connect admin@10.10.16.209   //ルーターサーバ自身のアドレス
create database testbase;
use testbase;
CREATE TABLE item (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(10),
  description VARCHAR(30),
  price INT UNSIGNED,
  created_at DATETIME
);