Ubuntu10.04 で、EC-CUBE 2.4.4 と WordPress 3.0.1 が動いているという、今となってはかなり特殊な(レガシーな)環境で動作しているサイトの常時SSL化をいたします。(備忘録)

1.WordPressのデータダンプ

# mysqldump -u root -ppassword wordpress-db > wordpress-db-dump20180918.sql

2.データダンプの書き換え(http ⇒ https)

# 画像ファイルは、http://hoge.com/??? を取る
# URLは書き換え
# wp_options は文字長が入っているので要注意

3.Let’s Encrypt (dehydrated)を入れる

# curl -kLO https://github.com/lukas2511/dehydrated/releases/download/v0.6.2/dehydrated-0.6.2.tar.gz
# tar xf dehydrated-0.6.2.tar.gz
# cd dehydrated-0.6.2
# cp docs/examples/config config
# nano config
WELLKNOWN=”/var/www/dehydrated” #コメントを取る
# mkdir /var/www/dehydrated
# nano /etc/apache2/conf.d/dehydrated.conf
Alias /.well-known/acme-challenge /var/www/dehydrated


# nano domains.txt
hoge.com www.hoge.com
# ./dehydrated –register –accept-terms
# ./dehydrated -c –accept-terms
# crontab -e
0 3 1,15 * * /root/dehydrated-0.6.2/dehydrated –config /root/dehydrated-0.6.2/config –cron >> /tmp/ssl-update.log 2>&1

4.apache2 への組み込み

# nano /etc/apache2/sites-available/default-ssl

NameVirtualhost *:443

ServerName hoge.com
ServerAlias www.hoge.com
DocumentRoot /www/wordpress/
ErrorLog /var/log/apache2/error.log
LogLevel warn
CustomLog /var/log/apache2/ssl_access.log combined
SSLEngine on
SSLCertificateFile /root/dehydrated-0.6.2/certs/hoge.com/fullchain.pem
SSLCertificateKeyFile /root/dehydrated-0.6.2/certs/hoge.com/privkey.pem
SSLCertificateChainFile /root/dehydrated-0.6.2/certs/hoge.com/chain.pem

# a2enmod ssl # sslモジュールを入れる
# a2ensite default-ssl
# service apache2 restart
# netstat -ltup4 # httpsが上がっていることを確認

5..htaccess の書き換え(http ⇒ https)

# nano /www/wordpress/.htaccess
RewriteEngine On
Options +FollowSymLinks
RewriteBase /
#RewriteRule ^index\.php$ – [L]
RewriteCond %{THE_REQUEST} ^.*/index.(html|php)
RewriteRule ^(.*)index.(html|php)$ http://%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^(www\.)?(hoge\.com)$ [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# uploaded files
RewriteRule ^files/(.+) wp-includes/ms-files.php?file=$1 [L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ – [L]
RewriteRule . index.php [L]

6.データダンプからデータベースを書き換え

# mysql -u root -p
use wordpress-db;
source db1.sql; # httpを書き換えたダンプ(UTFで保存)

7.WordPressテーマの書き換え

httpが直書きされてそうなファイル
# cd /www/wordpress/wp-content/themes/hoge/
functions.php
header.php
loop-index.php
style.css

8.EC-CUBEの書き換え

# nano /home/www/hoge/eccube-2.4.4/data/install.php
define (‘SITE_URL’, ‘https://shop.hoge.com/’);
define (‘SSL_URL’, ‘https://shop.hoge.com/’);

# httpが直書きされてそうなファイル
# nano /home/www/hoge/eccube-2.4.4/html/user_data/include/preview/bloc_preview.tpl
# nano /home/www/hoge/eccube-2.4.4/html/user_data/include/preview/footer.tpl
# nano /home/www/hoge/eccube-2.4.4/html/user_data/include/preview/header.tpl
# nano /home/www/hoge/eccube-2.4.4/html/user_data/packages/default/footer.tpl
# nano /home/www/hoge/eccube-2.4.4/html/user_data/packages/default/header.tpl
# nano /home/www/hoge/eccube-2.4.4/html/user_data/packages/default/bloc/optional.tpl
# nano /home/www/hoge/eccube-2.4.4/html/user_data/packages/default/bloc/other_menu.tpl
# nano /home/www/hoge/eccube-2.4.4/data/Smarty/templates/default/site_frame.tpl
# nano /home/www/hoge/eccube-2.4.4/data/Smarty/templates/default/detail.tpl
# nano /home/www/hoge/eccube-2.4.4/data/Smarty/templates/default/bloc/category.tpl

10.eth0がリネームされ、ネットワークが使えない時

# ifconfig
lo しか有効になっておらず、ネットワークアクセスできない。
# nano /etc/network/interfaces
eth0_rename になってた
# rm /etc/udev/rules.d/70-persistent-.rules
# reboot
これで直った。リネームされた原因不明

11.PostgreSQLが壊れていた場合(pg_xlog不整合でサービスが起動せず)

# su postgres
# cd /usr/lib/postgresql/8.4/bin
# ./pg_resetxlog -f /var/lib/postgresql/8.4/main/
# ./pg_ctl -D /var/lib/postgresql/8.4/main start
これで一応直る(でもDBがなくなってる)
# ./pg_ctl -D /var/lib/postgresql/8.4/main stop

# いろいろやったが結局、PostgreSQL を止めた状態で rsyncで正常に動いているサーバから丸ごと転送かけた
# rsync -rtlzvogpHAX –rsync-path=”/usr/bin/rsync” –block-size=4096 –delete -e “ssh -p 22” /var/lib/postgresql/8.4/ root@1.1.1.4:/var/lib/postgresql/8.4/

12.さくらのVPSでテスト環境を作る

12-1.OSはISOからインストールする
  ここ(http://old-releases.ubuntu.com/releases/10.04.0/)からダウンロード
  ubuntu-10.04.4-server-amd64.iso

12-2.sftpでサーバーへISOイメージをアップロードする
  コントロールパネルから「OSインストール」をクリックして「ISOイメージインストール」を選択
  「SFTPアカウントの作成を行う」を選択
  FTPで、アップロード

12-3.IPアドレスの設定
  Ubuntuの設定で、IPアドレスを設定します
  コントロールパネルの情報を転記(IPアドレス、ネットワークマスク、ゲートウェイ、DNSサーバー)
  あとで設定は上書きするので、「OpenSSH server」だけ選択

12-4.ログイン

12-5.rootのパスワードを設定
$ sudo passwd root
$ su –
#

12-6.visudo してsudo時にパスワードを聞かれないよう変更
# visudo
%sudo ALL=(ALL:ALL) NOPASSWD: ALL

12-7./etc/ssh/sshd_config を編集
# nano /etc/ssh/sshd_config
Port 22xx
PasswordAuthentication no

12-8.sshサーバを再起動
# service ssh restart

12-9.認証キーを作る
# cd
# mkdir .ssh
# nano .ssh/authorized_keys
# cp -a .ssh/ /home/myuser
# chown -R myuser:myuser /home/myuser/.ssh/

12-10.teratermからsshで入りなおす

訳あって最新版にできない Ubuntu10.04に Let’s Encrypt (dehydrated)を入れるためのメモ

前段階として、Ubuntu10.04 を update しておく。
それから、openssl と curl を TLS1.2対応にする。

# vim /etc/apt/sources.list

jp.archive –> old-releases
security –> old-releases

# apt-get update
# apt-get -y upgrade openssl
# apt-get -y upgrade curl

# cd
# wget https://www.openssl.org/source/openssl-1.0.2o.tar.gz
# tar xvfz openssl-1.0.2o.tar.gz
# cd openssl-1.0.2o
# ./config –prefix=/usr –openssldir=/usr/share/ssl shared
# make
# make test
# make install
# apt-get -y upgrade openssl

# cd
# wget http://curl.mirror.anstey.ca/curl-7.58.0.tar.bz2
# tar xf curl-7.58.0.tar.bz2
# cd curl-7.58.0
# ./configure –enable-libcurl-option –with-ssl=/usr –prefix=/usr
# make
# make test
# make install
# apt-get -y upgrade curl
# curl -V
# curl https://login.starbucks.co.jp/login

最後のスタバのログイン画面は TLS1.2でアクセスできたかどうかの確認。

Let’s Encrypt を入れるために、推奨されているのは Certbot なんだけど、python2.7 が必要だったり、Ubuntu10.04 にはいろいろ足りないものが多くて断念。
同じ機能(Certbot互換)の dehydrated でやってみる。(もちろんできたからこれを書いているんだけど)
git clone や wget でSSLエラーが出るので、tar.gzを取ってきて解凍。
あと、いろいろ面倒なので、root で作業。(よい子はマネしないように)

# curl -kLO https://github.com/lukas2511/dehydrated/releases/download/v0.6.2/dehydrated-0.6.2.tar.gz
# tar xf dehydrated-0.6.2.tar.gz
# cd dehydrated-0.6.2
# cp docs/examples/config config
# vim config # configのWELLKNOWNのコメントを外す

WELLKNOWN=”/var/www/dehydrated”

# mkdir /var/www/dehydrated
# chmod 755 /var/www/dehydrated
# vim /etc/apache2/conf.d/dehydrated.conf

Alias /.well-known/acme-challenge /var/www/dehydrated
<Directory /var/www/dehydrated/>
</Directory>
# これがないと怒られる。

# service apache2 restart

# apache2を再起動させないで「./dehydrated -c –accept-terms」をやるとエラーになります。
+ Challenge validation has failed 🙁
ERROR: Challenge is invalid! (returned: invalid) (result: {
“type”: “http-01”,
“status”: “invalid”,
“error”: {
“type”: “urn:ietf:params:acme:error:connection”,
“detail”: “Fetching http://hogehoge.com/wp-signup.php?new=hogehoge.jp: Error getting validation data”,
“status”: 400
},
ERROR: Challenge is invalid! (returned: invalid) (result: {
“type”: “http-01”,
“status”: “invalid”,
“error”: {
“type”: “urn:ietf:params:acme:error:unauthorized”,
“detail”: “Invalid response from http://hogehoge.jp/.well-known/acme-challenge/13oQnXoFMzKWEXdSXmavt-UTcW7CS_CD-UlQ9L_nhtY: \”\u003c!DOCTYPE html\u003e\r\n\u003chtml dir=\”ltr\” lang=\”ja\”\u003e\r\n\u003chead\u003e\r\n\u003cmeta charset=\”UTF-8\” /\u003e\r\n\u003ctitle\u003eNothing found for Well-known Acme-challe\””,
“status”: 403
},

# vim domains.txt

hogehoge.com www.hogehoge.com
# 必要なサブドメインはすべて書く。ワイルドカードも使えるらしいが怖くてテストしてない。
# 最初に書いたドメインでディレクトリが作られる。

# ./dehydrated --register --accept-terms
# ./dehydrated -c --accept-terms

# 最初の1回だけアカウントが作られる。
# domain.txt に書かれたドメインの証明書を取ってくる。
# 更新の都合もあるので、domain.txt にはすべてのドメインを書いておく。
# 更新の必要がなければ、スキップされる。

$ vim /etc/apache2/sites-available/default-ssl

<IfModule mod_ssl.c>
NameVirtualhost *:443
<VirtualHost *:443>
ServerName hogehoge.com
ServerAlias www.hogehoge.com
DocumentRoot /www/wp/
ErrorLog /var/log/apache2/error.log
LogLevel warn
CustomLog /var/log/apache2/ssl_access.log combined
SSLEngine on
SSLCertificateFile /hoge/dehydrated-0.6.2/certs/hogehoge.com/fullchain.pem
SSLCertificateKeyFile /hoge/dehydrated-0.6.2/certs/hogehoge.com/privkey.pem
SSLCertificateChainFile /hoge/dehydrated-0.6.2/certs/hogehoge.com/chain.pem
</VirtualHost>
# apache のバーチャルホストの書き方。

$ vim /www/wp/.htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^.*/index.(html|php)
RewriteRule ^(.*)index.(html|php)$ http://%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^(www\.|ww2\.|wp\.)?hogehoge\.com$ [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# http を https へリダイレクト。

$ service apache2 restart

# apache をリスタート。

毎月1日と15日に更新チェック
$ crontab -e

0 3 1,15 * * /root/dehydrated-0.6.2/dehydrated –config /root/dehydrated-0.6.2/config –cron >> /tmp/ssl-update.log 2>&1

@live.jpあてに転送したメールが届かないという相談がありました。
ログを調べてみると確かにブロックされてエラーになっています。

postfix/smtp[]: : to=<xxx@live.jp>, orig_to=<info@kdp-satooya.com>, relay=mx2.hotmail.com[65.55.37.120]:25, delay=1.1, delays=0.01/0/0.47/0.67, dsn=5.0.0, status=bounced (host mx2.hotmail.com[65.55.37.120] said: 550 SC-001 (COL0-MC4-F17) Unfortunately, messages from 49.212.132.42 weren't sent. Please contact your Internet service provider since part of their network is on our block list. You can also refer your provider to http://mail.live.com/mail/troubleshooting.aspx#errors. (in reply to end of DATA command))

550 SC-001:
ポリシーを理由にメールが Outlook によって拒否されました。拒否された理由は、メールの内容が迷惑メールの特徴に似ていることか、IP/ドメインの評価に関連している可能性があります。電子メールまたはネットワーク管理者のどちらでもない場合は、電子メールまたはインターネット サービス プロバイダーに連絡して支援を依頼してください。

うちのサーバーIP(49.212.132.42)が丸ごとブロックされているみたいです。
どうやら、なんらかのアルゴリズムでスパム発信元認定されたみたいです。
同様の現象は OCNでもSO-NETでも起きているので、うちも大手並み扱いされるようになったかと放置しておいてもいいのですが、いやそれはよくないので、解決策を探しました。

https://support.msn.com/eform.aspx?productKey=edfsmsbl2&ct=eformts
このURLからIPアドレスを送ったら、ものの30分ほどで解除してくれました。表現的には『軽減済み』ですけどね。

同じくこの問題で困っている方、参考になさってください。

Detectifyというサイトがあって、無料で脆弱性のチェックをしてくれる。

登録の仕方等の使い方は、こちら「あなたのWebサイトの脆弱性を調査してくれるサービス『Detectify』」が詳しい。

Scan Startして3日ほどで結果を返してくれる。
試しにうちで管理しているサイトのひとつを調べて見たら、以下のような結果に。
0 Exploits Found / 24 Warnings Found / 222 Notices Found

危ない(Exploits)はゼロでよかったが、注意(Warnings)が24もあるのは気になる。
今日はこれをつぶしていこう。

  1. PHP Easter Egg
    URLの最後に「?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000」これを付けると、phpinfo()が表示されてしまうという、ちょっとしたTips。設定ファイルとか、なんのLIBが有効かなどがわかると侵入者に手がかりを与えかねないのでこれはふさいでおこう。
    「/etc/php5/apache2/php.ini」に「expose_php = On」があるので、これを Offにして完了。

    ※参考> [PHP]phpinfo()に関する小ネタHack

  2. Operating System Disclosure
    ApacheのレスポンスにOSが出ているよという警告。これも隠しておこう。
    「/etc/apache2/conf.d/security」の「ServerTokens Prod」と「ServerSignature Off」で Serverは「Apache」だけになる。

    ※参考> 【Apache】HTTPヘッダの確認方法とセキュリティ対策(レスポンスヘッダの変更方法)

  3. Directory Listing
    ディレクトリ一覧(ファイル一覧)が見えてるところがあるよという警告。これはつぶしておく。
    「/etc/apache2/conf.d/security」に「Options Includes ExecCGI FollowSymLinks」を追加。
    これ自体は、CGIとシンボリックリンクの許可だが、明示的に Optionsを指定することで「Indexes」(ファイル一覧)を禁止することになる。

    ※参考> 第2回 ディレクトリ非表示の意味をもう一度見つめ直す

  4. Cookie not HttpOnly
    HttpOnlyクッキーにしないと、javascript等から読みだされてしまうよということなんですが、変更したときの影響がよくわからないので、ペンディング。
  5. Input AutoComplete
    オートコンプリートが Onになっていると危ないよという指摘だが、これは使い勝手とのトレードオフになるので、このまま放置。

    ※参考> HTML でオートコンプリートをオフにする方法

  6. Unencrypted Login
    WordPressのログイン画面が httpなので、これをSSL(https)にしなさいという指示。
    wp-config.phpに「define(‘FORCE_SSL_LOGIN’, true);」を追加するだけでできるのだが、SSL証明書を用意したり、他のお客様(マルチドメインで運用しているので)への影響を考えてペンディング。

    ※参考> Administration Over SSL

詳しく原因まで追究できていないんだけど、誰かの役に立てばと思いアップ。


PHP 5.2.6 で動作していた imap_open() が、PHP 5.3.2 になると動かなくなった。

#!/usr/bin/php -q
#PHP 5.2.6 のサンプルコード
<?php
$mailserver = "example.com";
$mbox = imap_open("{".$mailserver.":110/pop3/notls}INBOX", "user@".$mailserver, "password", "OP_READONLY");
var_dump($mbox);
if ($mbox) {
  imap_close($mbox);
}
?>

PHP 5.2.6では、このコードはエラーなく動く。

PHP 5.3.2では、以下のエラーになる。

PHP Warning:  imap_open() expects parameter 4 to be long, string given in ...

文字列(”OP_READONLY”)が整数(OP_READONLY)に変わったようだ。
ここを修正してもエラーになる。

PHP Warning:  imap_open(): Couldn't open stream {mail.example.com:110/pop3/notls}INBOX in ...
bool(false)
PHP Notice:  Unknown: Read-only POP3 access not available (errflg=2) in Unknown on line 0

POP3のリードオンリーはダメみたいだ。

しかたがないので、pop3は使わず、imapにしたらうまくいった。

#!/usr/bin/php -q
#PHP 5.3.2 のサンプルコード
<?php
$mailserver = "example.com";
$mbox = imap_open("{".$mailserver.":143/imap/notls}INBOX", "user@".$mailserver, "password", OP_READONLY);
var_dump($mbox);
if ($mbox) {
  imap_close($mbox);
}
?>

pop3もimapもサポートしてるメールサーバじゃないとダメだけど、一応解決ということで。

やりたいことはタイトル通りです。

お客様用に ThinkPad Edge E420を買ったのはいいのですが、このOSが「Windows 7 Home Premium 64」一択で他の選択肢はナシときた。
Office付きを買ったし、別にいいかと思っていたのですが、お客様がどうしても使いたい「文籍(MonJack)」というフリーのソフトが Delphiの32ビット環境で作られており、これがどうやっても動かない。
じゃあ、XPモードでとなるわけですが、Home Premium には XPモードがないよーというわけです。
手順はこんな感じです。

  1. Windows XP Mode のダウンロード
    エディションは「Professional 64ビット版」とかを選んでおくこと。Homeだと選択肢がでない。
    2番目にインストールの「Virtual PC Download」をクリック。
    インストールは「更新プログラムのインストール」みたいになるので、一瞬アレっとなるけど、終わってスタートメニューを見るとちゃんと入っている。
  2. 仮想マシンの作成
    ここでちゃんとしたXPが必要になります。(うちには使わなくなったXPがごろごろしているので問題ありませんが)
    メモリー容量はあとで変えられます。
    CDドライブにXPのインストールCDをセットして、作成した仮想マシーンをダブルクリックし、通常通りXPをインストール。
    一番の問題はパーテションを切るとき、ケチって 10GBとかにしないこと。SP3までアップグレードしたらだいたい10GBがいっぱいになります。20~30GBくらいは切っておきましょう。
  3. 統合機能
    仮想マシーンの「ツール」メニューから「統合機能を有効にする」をクリックする。
    あとは、仮想マシーンの「設定」メニューでドライブ割り当てなどを適宜行う。
  4. パーテションを拡大したいとき
    ケチって10GBとかにした場合のパーテション拡大方法は、仮想ハードディスクのサイズを拡大する に書いてある通り。
    注意点としては、VHD Resizerで拡大するとき、Fixed(容量固定)を選択すること。Dynamic(容量可変)だとうまくいかなかった。
    また、できあがった「.VHDファイル」を仮想マシーンの「設定」メニューで 2台目のハードディスクとしてマウントすること。
    そしてパーテション拡張が終わったら、1台目のハードディスクとしてマウントすればOK。