SSL証明書のエラー

ずいぶんご無沙汰な更新となりました・・・これからはもっとマメに更新します
今日は、ユーザーから証明書について問合せがありました。詳しく聞くとどうやらFirefox2.0系でhttpsページを開くとエラーが出るため、認証局へ問い合わせたところ中間証明書が正しくインストールされていないのでは?と指摘があったとの事。

早速確認してみます。先ずは証明書が正しくインストールされているかを確認してみます。

# openssl x509 -text -noout -in /etc/httpd/conf/ssl.crt/dvcacert.cer
unable to load certificate
2673908:error:010405D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:644:Expecting: TRUSTED CERTIFICATE

げげ、中間証明書でエラーが出る。よくよく見てみると証明書本体でも同じようなエラーが出ることが発覚
catで証明書を見てみたところ、明らかにおかしい・・・

-----BEGINCERTIFICATE-----
MIIEQDCCAyJFUDOkduiHHfksjuw9ks5sffufgwJJKoZIhvcNAQEFBQAwcTELMAkG
ksue9ut84kfhgg73BgNVBAsTFEJHYIGdygadiggjtDIFKShJDIi67NFJSGAKSGYA
省略
ksiIYGFwjsuUwhwuIskwukUIJMhjkuPAWTD1tq5uh/F6MZnTczyU/mFQF/45zJxL
UFYesuisYHjuseoqw89e37wjsyskwuUHsywyGYDFjyskauUsgaskdiwuwjwiFIdH
-----ENDCERTIFICATE-----

確か「BEGIN」と「CERTIFICATE」の間にスペースがあるはずなのに、、ない
ユーザーからメールで送られてきた証明書を見ると、確かにスペースがあります。
ためしにテキストエディタにコピーしてみると、スペースがコピーされません・・・なんてこったい
きちんとスペースを入れてみたところ、エラーもなく無事解決しました。

恐らく変なエンコーディングがされてしまったがために、コピーアンドペーストがうまくいかなかったのでしょう
これからはきちんと証明書の確認までしなくてはだめですね・・・

それにしてもどうしてIEではエラーが出なかったのか・・・?

viのちょっと便利な使い方

UNIX系サーバーを使用する上で、viは避けて通れません。
編集には苦労することはないんですがたまたま専門の本があったのでチラッと読んでみました。
たくさん知らないTIPSがあって勉強になりました。今日はその中でも実用度が高そうなものをピックアップ

■vi起動時
vi +N FILE

  • > FILEのN行目にいきなり移動する

vi + FILE

  • >FILEの末尾にいきなり移動する

vi +/SEARCH FILE

  • >FILEないのSEARCHを検索する

■移動
◇一般的な移動
w W

  • >次の単語の先頭に移動する

e E

  • >次の単語の末尾に移動する

b B

  • >直前の単語の先頭に移動する
  • >行頭に移動する

$

  • >行末に移動する

◇画面相対で移動
H 表示されている画面上の最上段の単語の先頭に移動(HOME)
M 表示されている画面上の中央行の単語の先頭に移動(MIDDLE)
L 表示されている画面上の際下段の単語の先頭に移動(LOW)

◇スクロール移動
Ctrl+F 一画面分下へ移動する
Ctrl+B 一画面分上へ移動する

Ctrl+U 半画面分上に移動する
Ctrl+D 半画面分下に移動する

■置き換え
[N]s

  • >現在のカーソル位置からN文字分を置き換えます。vimでは、削除されすぐにinsertモードになるようです

cw

  • >現在のカーソル位置から1単語分を削除しinsertモードに移ります

[N]C [S]

  • >現在のカーソル位置からN行分を置き換えます。vimでは削除されすぐにinsertモードになるようです

■削除
[N]dd

  • >現在のカーソル位置からN行分を削除

D

  • >現在のカーソル位置から行末までを削除

■検索
/SEARCH

  • >文字列を検索する。次の検索対象を下方向にサーチするときはnを、上方向にサーチする時はN

■その他
:sh

  • >編集中に一度shellを起動する。exitで元に戻る

:!コマンド

  • >編集中にshellコマンドを実行する。:r!コマンドとすることで指定行にコマンドの結果を書き込む

:file or Ctrl+G

  • >現在の行位置、全体の行数を表示する

SSL証明書のインストール

ワイルドカードSSL証明書をインストールすることになったのでその時のメモ

秘密鍵の作成とCSRの発行

証明書を信頼されたCAから発行してもらうにはサーバーでCSRを作成し提出する必要があります
環境としてはApache2.0+mod_SSL+OpenSSLの組み合わせとなります。利用する証明書はグローバルサイン社の
クイックSSLワイルドカード証明書です。

先ずはSSLをインストールするディレクトリへ移動します、念のためOpenSSLが組み込まれているか確認

# cd /etc/httpd/conf
# openssl version
OpenSSL 0.9.7m 23 Feb 2007

次に秘密鍵を生成します。入力したパスフレーズを忘れると大変です。必ず忘れないように

# openssl genrsa -des3 -out ./ssl.key/hogehoge.com.key 1024
Generating RSA private key, 1024 bit long modulus
..............................++++++
................................................++++++
e is 65537 (0x10001)
Enter pass phrase for ./ssl.key/hogehoge.com.key:******
Verifying - Enter pass phrase for ./ssl.key/hogehoge.com.key:******

続いてCSRの発行に移ります。コマンド実行後必要な情報に答えていきます
ワイルドカード証明書なので、コモンネームの欄は「*.hogehoge.com」とします。
通常の証明書の場合には、必ずアクセスさせたいFQDNを入力します。コモンネームを「hogehoge.com」
として証明書を作成した場合、「www.hogehoge.com」としてアクセスするとエラーが表示されます。

CSRに必要な情報は以下の通りです。

Country Name(国名)
State or Province Name(都道府県)
Locality Name(市区町村)
Organization Name(組織名)
Organization Unit Name (部署名)
Common Name(証明に利用するFQDN

その他の項目はすべて[]空欄のままでスキップして問題ないようです

# openssl req -new -key ./ssl.key/hogehoge.com.key -out ./ssl.csr/hogehoge.com.csr
Enter pass phrase for ./ssl.key/hogehoge.com.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

        • -

Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:Tokyo
Locality Name (eg, city) [Newbury]:Minato-ku
Organization Name (eg, company) [My Company Ltd]:HARUKA.ltd
Organizational Unit Name (eg, section) :HARUKA
Common Name (eg, your name or your server's hostname)
:*.hogehoge.com
Email Address :

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password :
An optional company name []:

するとこんな感じでCSRが生成されます。これをそのままCAに送って証明書を待ちます。

-----BEGIN CERTIFICATE REQUEST-----
jlasdf7qrjhnadvytqpofgrtw6w3hneuedodyh
roqu9p9t54gmkgvhz;:edy8weuipogosyg97a0
hg8093jaduiqaufra6e3g4ega13d5*6ra4ya1h
-----END CERTIFICATE REQUEST-----

SSL証明書のインストール

CAから証明書が届いたら証明書のインストール(というか保存)をします。中間証明書と証明書どちらも〃ディレクトリに保存しました。dvcacert.cerは中間証明書です。

vi /etc/httpd/conf/ssl.crt/dvcacert.crt
vi /etc/httpd/conf/ssl.crt/hogehoge.com.crt

httpd.confの修正

httpd.confで証明書のファイルを指定するディレクティブを追加します。サーバーではヴァーチャルホストに利用するので、以下のように記述しました。


  SSLEngine on
ServerName www.hogehoge
DocumentRoot /var/www/html/hogehoge.com/
  ## certificate file path below
  SSLCertificateChainFile /etc/httpd/conf/ssl.crt/dvcacert.cer
  SSLCertificateFile /etc/httpd/conf/ssl.crt/hogehoge.com.crt
  SSLCertificateKeyFile /etc/httpd/conf/ssl.key/hogehoge.com.key

AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all

CustomLog /var/log/httpd/hogehoge.com/access_log combined
ErrorLog /var/log/httpd/hogehoge.com/error_log

設定が終了したらApacheを再起動します。秘密鍵に設定されたパスフレーズが要求されるので入力します。
ただしいパスフレーズを入力しませんとサーバーは起動しません。起動したら「https:〜」でアクセスし正常に証明書が表示されることを確認します。

# /etc/rc.d/init.d/httpd restart
Stopping httpd: [ OK ]
Starting httpd: Apache/2.0.52 mod_ssl/2.0.52 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.

Server hogehoge.com:443 (RSA)
Enter pass phrase:********

パスフレーズの入力省略

上記のようにSSL証明書を読み込む場合、基本的にはパスフレーズを入力しなければなりません。しかしこれではレンタルサーバーなどで再起動が発生する場合などには対応が出来ません。
以下のコマンドで、パスフレーズを抜くことが出来ますが、セキュリティ上あまり好ましくないかもしれません。

openssl rsa -in key.pem.org -out key.pem

そこで今回は、mod_sslの機能を利用して自動でパスフレーズを入力できるようにしてみます。
具体的には、/etc/httpd/conf.d/ssl.confの中で「SSLPassPhraseDialog」ディレクティブに設定します。

SSLPassPhraseDialog exec:/etc/httpd/conf/ssl.key/passphrase.sh

passphrase.shファイルは以下のようにパスフレーズが出力されるようにシェルスクリプトとして書いておきます

#!/bin/sh
echo "passphrase"

こうすることで、パスフレーズを入力しなくてもApacheが起動できます。セキュリティのため、root:rootで700パーミッションにしておけばよいかと思います。

不正アクセスされたかも?

作業していた時に何気なくnetstatを見たら見たことも無いIPアドレスからxinetd経由で22番ポートに接続されステータスがESTABLISHになっていたのでびっくり。入られた!?かと思いました。

でもよく考えてみればSSHにセッションを張られただけでも、ESTABLISHにはなるはず、パスワード認証を通されたのとは別だよね、と。それにSSHはパスワード認証は許可していないのでまぁ大丈夫か。
/var/log/secureを見てみると、こんなログがわさわさと、、、

Feb 21 05:33:48 ***** xinetd[26271]: START: ssh pid=11295 from=216.40.225.63
Feb 21 05:33:49 ***** sshd[11295]: reverse mapping checking getaddrinfo for ev1s-216-40-225-63.ev1servers.net [216.40.225.63] failed - POSSIBLE BREAK-IN ATTEMPT!
Feb 21 05:33:49 ***** sshd[11295]: Invalid user akov from 216.40.225.63
Feb 21 05:33:49 ***** sshd[11295]: error: Could not get shadow information for NOUSER
Feb 21 05:33:49 ***** sshd[11295]: Failed password for invalid user akov from 216.40.225.63 port 36805 ssh2

ホスト名も、IPも晒してしまえ。
どうやらブルートフォースアタックみたいですね、とりあえず総当りでユーザーとパスワードをぶっつけてみよう、みたいな。
iptables設定しなきゃなーと思っていたところなので、ちょうどいい引き締め材料になりました。
やっぱり、セキュリティ対策はきちっとしないとだめですね、それにSSHのポート番号も変えてしまおう。

ちなみにPOSSIBLE BREAK-IN ATTEMPT!をそのままyahoo翻訳してみたら「ありうる侵入未遂!」でした

makewhatisで負荷

先週の日曜日に発生したロードアベレージのアラート、今週の日曜日も発生しました。
日曜日に発生したということであたりは付いていたんですが、ビンゴでした。原因はcronのmakewhatis

cronとは定期的にプログラムを動作させるデーモンで、個別に時刻を設定できるほか、/etc以下にそれぞれ時、日、週、月のディレクトリがあり、ここにプログラムを設置することで/etc/crontabで設定された時間に動作します。

こんな感じで、それぞれ設定された時間にディレクトリ配下のプログラムが動く

/etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

で、cron.weeklyにあるプログラムをそれぞれ、テスト環境で動作させてみたところ、makewhatisコマンドの時にロードアベレージが高くなりました。
手元のテスト環境でも同じようにロードアベレージが2近くまで上がりました。


まぁ、それほど必要のないプログラムなので実行権限を落として様子を見る事にしました。
これは普通なんでしょうかねぇ??

# chmod 644 00-makewhatis.cron

locateコマンド

改めて書くほどのトピックではないんだけど、とりあえず思いついたのでメモ
サーバーでlocateコマンドを叩いたらこんなエラーが

# locate httpd.conf
warning: locate: could not open database: /var/lib/slocate/slocate.db: No such file or directory
warning: You need to run the 'updatedb' command (as root) to create the database.
Please have a look at /etc/updatedb.conf to enable the daily cron job.

locateコマンドが参照するdbがないので、updatedbを叩くか、/etc/updatedb.confでデイリーのcronをenableにしなさいよ。ってこと。

# less /etc/updatedb.conf
# To enable the updatedb in cron, set DAILY_UPDATE to yes
DAILY_UPDATE=no

PRUNEFS="sysfs selinuxfs usbdevfs devpts NFS nfs nfs4 afs sfs proc smbfs cifs autofs auto iso9660 udf"
PRUNEPATHS="/tmp /usr/tmp /var/tmp /afs /net /sfs /selinux
/udev /mnt/floppy /media"
export PRUNEFS
export PRUNEPATHS

DAILY_UPDATE=yesとするとcron.dailyにあるlocateが走って毎日updatedbが実施されます。ちなみに

になります。引用した中では一時ディレクトリが除外されています。大量のファイルがあればあるほどupdateには時間と負荷がかかります。検索の必要のないディレクトリがあればここに記載すればいいでしょう。

もうひとつちなみに。現在ほとんどのディストリビューションではlocateコマンドはslocateコマンドへのシンボリックリンクになっています。
slocateはlocateコマンドのセキュリティ機能を強化したもので、ファイルのパーミッション情報を付加することで、セキュリティを高めています。

# ls -la /usr/bin/locate
lrwxr-xr-x 1 root root 7 Oct 9 23:18 /usr/bin/locate -> slocate

logrotateがうまくいかない?

新しいサーバーを納入して一週間が経過、昨日の日曜日の深夜CPUのアラートが上がったと申告が。いろいろ調べてみたんですが、どうにも原因が分からない。そんな折/var/log/messagesにこんなエラーが・・・

Feb 9 04:02:12 hogehoge logrotate: ALERT exited abnormally with [1]
Feb 10 04:02:09 hogehoge logrotate: ALERT exited abnormally with [1]
Feb 11 04:02:10 hogehoge logrotate: ALERT exited abnormally with [1]
Feb 12 04:02:10 hogehoge logrotate: ALERT exited abnormally with [1]

げげげ!!と思ってログを確認してみると、ローテーションが正常に行われていない!!
あわててログのローテーションが正常に行われているかをチェックします。

# /usr/sbin/logrotate -vd /etc/logrotate.conf
reading config file /etc/logrotate.conf
including /etc/logrotate.d
reading config file acpid
reading config info for /var/log/acpid
reading config file cups
reading config info for /var/log/cups/*_log
reading config file httpd
reading config info for /var/log/httpd/*log /var/log/httpd/hogehoge/*log
reading config file httpd.default
error: httpd.default:1 duplicate log entry for /var/log/httpd/access_log
*コマンドは-vdで詳細を出力+デバッグモードで表示になります

やっぱりエラーが出ていました。ちゃんと事前に確認しておかないとだめですね・・・

原因をいろいろと調べてみました。今回ログをローテーションするにあたってhttpdのログローテーション(/etc/logrotate.d/httpd)を変更したんですがそのときにデフォルトファイルをhttpd.defaultで保存して同じディレクトリに置いておいたんです。どうやらそれが原因の様子。
ファイルを.httpd.defautにして隠しファイルにしてみたんですが結果は変わらず。ためしに別のディレクトリに移してみたところようやく正常に動作したようです。

# mv httpd.default ../
# /usr/sbin/logrotate -vd /etc/logrotate.conf
reading config file /etc/logrotate.conf
including /etc/logrotate.d
reading config file acpid
reading config info for /var/log/acpid
reading config file cups
*****長いので割愛*****

ちゃんと動作確認を行ってから出ないと危険ですね!