postfixとdovecot2.x系でSSL通信で構築する場合の設定

はじめはWEB用の目的でSSLを購入しても、どうせだったらメールもより安全に通信を行いたい!!と思ったので、WEB用のSSLをメールにも使ってみた。

忘れないように自分用のメモ。

前提としては、

postfixとdovecot2.x系をpostfixadminで使っている。

また、メール情報はmysqlで保存している。

上記のやり方は様々なサイトに書かれているので、割愛。

また、メールサーバーのホスト名が取得したSSL証明書に設定したホスト名が一致している事が条件です。

一致していなければ、ワイルドカード「*.example.com」などのSSL証明書を購入する必要があります。

一番悩んだのは、postfixにもdovecotにも証明書をインストールしているのだけど、なぜか不明は証明書となっていまう。

テストしたクライアントはThunderbirdです。

色々悩んだ結果、メールにも中間証明書が必要だったということ・・・・

うーんここに行き着くのに時間がかかっていまった・・・

また、下記のようにそれぞれの設定ファイルに証明書のパスをインストール

もちろん中間証明書も忘れずに・・・

 vi /etc/postfix/main.cf
smtpd_tls_cert_file = /etc/pki/tls/certs/server.crt
smtpd_tls_key_file = /etc/pki/tls/certs/server.key
ssl_ca_file = /etc/pki/tls/certs/server-chain.crt←中間書証明書
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache

で、dovecotも同じように

smtpd_tls_cert_file = </etc/pki/tls/certs/server.crt
smtpd_tls_key_file = </etc/pki/tls/certs/server.key
ssl_ca = /etc/pki/tls/certs/server-chain.crt←中間書証明書

上記をいれるけど、注意したいのは、ssl_ca_fileではなくssl_caと言うことです。

上記で、問題なく設定完了

あとは、お決まりの再起動をします。

Gmailのフェッチでも問題なくSSLで使えました。

うーん時間かかったなぁ

phpMyAdmin 3.5.0で文字化けする場合の対処方法

現在動かしているサーバーのデフォルトの文字環境はUTF-8で動かしている。

でも、最新版phpMyAdmin3.5.0を入れるとおもいいきり文字化けした・・・・なんで・・・・

色々調べていると、いくつかの解決策のようなものがあった。

結論で行くとなんとか解決できた

インストール編

まずは、普通にダウンロードしてインストールを行う。

あっつちなみに参考にしたサイトは下記

http://9jp.info/archives/12024

ここで注目したのは下記

phpMyAdminディレクトリ以下の、examples/create_tables.sql のSQLを実行してphpMyAdmin用データベース()及びテーブルを作成する。
1
source SQLファイルを指定

上記に書いてあるように、SQLを実行してphpMyadmin用のデータベースを作る。

あれ?こんな事したことなかったような・・・

以上でインストール編は終わり

php.ini設定編

はじめにも書いたけど、UTF-8環境で動かすと言うことはphp.iniの設定もUTF-8に合わせていると思う。

でもこれだと文字化けが起こる。

なので、.htcaccessを使って下記内容を記述。

phpMyAdmin関係のディレクトリに置く。

<IfModule mod_php5.c>
 php_value default_charset "NULL"
 php_value mbstring.language "neutral"
 php_value mbstring.internal_encoding "NULL"
 php_value mbstring.detect_order "NULL"
 php_flag mbstring.encoding_translation Off
</IfModule>

早い話が、デフォルト設定に戻すということ。

以上で文字化けは回避できたのでした。

クロスドメインでiframeの親に値を渡す。

iframeについてメモ。

iframeはセキュリティーの都合上で、別ドメインでは値を渡せないらしい。

実際ためしてみても、うまく行かなかった。

使用用途としては、スクロールバーなどを表示させずにインラインフレームとして表示する場合に、横幅は100%で対応できても高さがページによって可変な場合がある。

この場合は、スクロールバーが表示されるか、やけに下に余白ができる感じになってしまい実用的ではない。

そこで、高さの値を子から親へ渡して、iframeの属性で高さを指定できるようにする。

色々調べて今のところこの方法でいけた。

でも、IE6~7までは見対応なのでそのへんはあしからず。逆に対応できる方法を知っている人教えてください。

それではやり方。

まず子のファイルに下記内容が飛鳥

<script type="text/javascript">
function onlo(){
 var height = document.getElementById("inHeight").offsetHeight;
 document.getElementById("hei").value = height;
 parent.postMessage(document.getElementById("hei").value, "*");
}
</script>
</head>
<body onload="onlo()">
<input type="hidden" id="hei" />
<div id="inHeight">
//////中身///////
</div>
</body>
</html>

これは、基本となる高さををoffsetHeightで取得して、inputで渡している。

親側の受け取りはonmessageで受け取る。

<input type=”hidden” id=”hei” />にvalue属性に値を渡している。

 document.getElementById("hei").value = height;

その後の

 parent.postMessage(document.getElementById("hei").value, "*");

で親に渡す。

親側は・・・・

<script type="text/javascript">
 window.onmessage = function(e){
 document.getElementById('blockrandom').height = e.data+'px';
 }
</script>
<iframe
 name="myframe"
 id="blockrandom"
 src="http://www.----ここに子のURLを入れる-----"
 scrolling="no"
 frameborder="0"
 width="100%"
>
</iframe>

な感じで高さを渡す。

これで読み込み時に高さを判断して自動で調整してくれるはず。

 

Dosアタック攻撃に対する対策について

サーバーを色々触っていると、悪事をはたらく人たちの痕跡があります。

とくに、さくらVPSはスペックがよくない(低いプランは)ので、F5攻撃などがあればすぐにダウンする可能性が大です。

なので、DOS攻撃対策として、

mod_dosdetector

をインストールしたので、メモ書きです。

mod_dosdetectorは悪意のあるアクセスを判断してくれるモジュールです。

その判断されたデータを元に一時的に503を返してアクセスできなくしようと言うものです。

また、設定も細かくできるし日本語の情報も多いのオススメです。

と言うかこれしか試していません・・・・

ちなみに、下記やり方は他のサイト様の寄せ集めです。

参考にしたサイト

http://www.jisakuroom.net/blog/?p=201

http://c-brains.jp/blog/wsg/10/06/24-134947.php

http://ymotoba.blogspot.com/2009/05/apachedso.html

はじめにダウンロードします。

wget http://downloads.sourceforge.net/project/moddosdetector/moddosdetector/version-0.2/mod_dosdetector-0.2.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fmoddosdetector%2F&ts=1293763310&use_mirror=jaist
tar -xzvf mod_dosdetector-0.2.tar.gz

次にインストールします。

その前に準備です。

yum install httpd-devel
cd mod_dosdetector-0.2
make 
コンパイルがすんだらインストールします。
make install
インストールがエラーなく終了すれば、httpd.confの設定を行います。
インストールがうまくいっていると、httpd.confに自動でモジュールの読み込みが記述されますが、今回は設定部分は別ファイルで行うために、httpd.confの記述はコメントアウトします。
vi  /etc/httpd/conf/httpd.conf
LoadModule dosdetector_module /usr/lib/httpd/modules/mod_dosdetector.so 
↓コメントアウト
#LoadModule dosdetector_module /usr/lib/httpd/modules/mod_dosdetector.so

次に、設定用ファイルを新規作成

vi /etc/httpd/conf.d/dos_attack.conf

ファイルの中身は次の内容で、

RewriteEngine On
RewriteCond %{ENV:SuspectHardDoS} =1
RewriteRule .*  - [R=503,L]
ErrorDocument 503 "Server is busy."

# デフォルトでは favicon のコンテンツタイプは指定されていないので設定
AddType image/vnd.microsoft.icon .ico

# モジュール読み込み
LoadModule dosdetector_module /usr/lib/httpd/modules/mod_dosdetector.so

# モジュール設定
DoSDetection On
DoSPeriod 60
DoSThreshold 70
DoSHardThreshold 90
DoSBanPeriod 7200
DoSTableSize 500
DoSIgnoreContentType ^(image/|application/|text/javascript|text/css)

各設定は次の内容

DoSDetection
DoS 攻撃の検知を有効にするかどうか。
DoSPeriod
DoS 攻撃の判定を行う時間を設定。(秒)
DoSThreshold
DoSPeriod の間にこの数だけアクセスがあれば DoS 攻撃の疑いありとみなし、環境変数 SuspectDoS を 1 にセットする。
DoSHardThreshold
DoSPeriod の間にこの数だけアクセスがあれば DoS 攻撃の疑いが強いとみなし、環境変数 SuspectHardDoS を 1 にセットする。
DoSBanPeriod
DoS 攻撃の疑いが設定されてから解除するまでの時間。(秒)
DoSTableSize
クライアントの追跡記録を保存する数。多すぎるとその分リソースを消費する。
DoSIgnoreContentType
追跡記録から除外するコンテンツタイプをパターンマッチングな文字列で指定。
RewriteEngine On
RewriteCond %{ENV:SuspectHardDoS} =1
RewriteRule .*  - [R=503,L]
ErrorDocument 503 "Server is busy."

上記の設定は、dosアタックと判断した時に行う処理の部分。

注意点はvirtualhostを使用している場合は、

vi /etc/httpd/conf.d/dos_attack.conf

内に記述するのではなく、virtualhosないの各ディレクティブに記述する必要がある。

以上で設定は終わり。

後は、テストしてどうかを見る。

通常通りうごいていると、

Server is busy.

と表示される

Apacheの構築

インストールと設定はroot権限が必要なコマンドばかりなので、各種インストールの間だけ、sudo ではなく su でrootになって進めましょう。

[admin@ ~]$ su -
 Password:
 [root@ ~]#

CentOSではパッケージのインストールと管理に yum というプログラムを使います。さくらのVPSでは最初から yum がインストール済みで、起動直後から使うことができます。一応、新しくインストールをする前に、既にインストールされているものを最新版にアップデートします。

[root@ ~]# yum -y install httpd

まずはインストールに問題がないか起動してみます。

[root@ ~]# /etc/rc.d/init.d/httpd start
 Starting httpd: [ OK ]

無事に起動できたら、続いて自動起動の設定をします。

[root@ ~]# chkconfig httpd on

設定を確認してみましょう。

[root@ ~]# chkconfig --list httpd
 httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

chkconfig –list を実行すると,起動設定されたラン・レベルの一覧が表示できます。(0:システムの停止,1:シングル・ユーザー,2:ネットワーク機能なしのマルチユーザー,3:CUIログインのマルチユーザー,4:カスタム,5:GUIログインのマルチユーザー,6:システムの再起動)さくらのVPSを起動した時に稼動状態になる為には 3 が on になっている必要があります。起動が問題ないようなので、続いてApacheの設定をします。

Apacheの設定

いちおう元ファイルをコピーしてから vi で開きます。

[root@ ~]# cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
 [root@ ~]# vi /etc/httpd/conf/httpd.conf

1.レスポンスヘッダにOSのバージョンを表示させない

ServerTokens OS
   ↓
 ServerTokens Prod

2.KeepAliveを有効にする

KeepAlive Off
   ↓
 KeepAlive On

3.モジュールの読み込み設定

モジュールは必要に応じて設定してください。自分は以下のように設定しました。

LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authn_alias_module modules/mod_authn_alias.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_owner_module modules/mod_authz_owner.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
LoadModule authz_default_module modules/mod_authz_default.so
LoadModule ldap_module modules/mod_ldap.so
#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
#LoadModule ext_filter_module modules/mod_ext_filter.so
LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
#LoadModule headers_module modules/mod_headers.so
#LoadModule usertrack_module modules/mod_usertrack.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
#LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule info_module modules/mod_info.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
LoadModule actions_module modules/mod_actions.so
LoadModule speling_module modules/mod_speling.so
#LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule cache_module modules/mod_cache.so
LoadModule suexec_module modules/mod_suexec.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule file_cache_module modules/mod_file_cache.so
LoadModule mem_cache_module modules/mod_mem_cache.so

4.サーバー管理者の指定

ServerAdmin root@localhost

 
ServerAdmin admin@domain.com
5.サーバー名の指定

ServerName new.host.name:80

ServerName www.domain.com:80
6.DocumentRootの確認

DocumentRoot “/var/www/html”
7.ディレクトリ内のファイル表示を無効化

Options Indexes FollowSymLinks

Options -Indexes FollowSymLinks

8.indexの設定

DirectoryIndex index.html index.html.var

DirectoryIndex index.html index.php index.cgi index.html.var
9.ログの設定(414 ERROR は記録しない)

LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined

LogFormat “%h %l %u %t \”%!414r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
10.カスタムログの設定(wormと画像のアクセスをログに記録しない)

CustomLog logs/access_log combined

SetEnvIf Request_URI “cmd\.exe” nolog
SetEnvIf Request_URI “root\.exe” nolog
SetEnvIf Request_URI “Admin\.dll” nolog
SetEnvIf Request_URI “NULL\.IDA” nolog
SetEnvIf Request_URI “^/_mem_bin/” nolog
SetEnvIf Request_URI “^/_vti_bin/” nolog
SetEnvIf Request_URI “^/c/” nolog
SetEnvIf Request_URI “^/d/” nolog
SetEnvIf Request_URI “^/msadc/” nolog
SetEnvIf Request_URI “^/MSADC/” nolog
SetEnvIf Request_URI “^/scripts/” nolog
SetEnvIf Request_URI “^/default.ida” nolog
SetEnvIf Request_URI “\.(gif)|(jpg)|(png)|(ico)|(css)$” nolog
SetEnvIf Remote_Addr 192.168. no_log
CustomLog logs/access_log combined env=!no_log
11.エラー画面でApacheのバージョン非表示

ServerSignature On

ServerSignature Off
12.indexesがOFFなのでファイル表示のアイコンの設定はコメントアウトします。

Alias /icons/ “/var/www/icons/”

Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all


#Alias /icons/ “/var/www/icons/”
#
# Options Indexes MultiViews
# AllowOverride None
# Order allow,deny
# Allow from all
#
13.ScriptAliasも使わないのでコメントアウト

ScriptAlias /cgi-bin/ “/var/www/cgi-bin/”

AllowOverride None
Options None
Order allow,deny
Allow from all


#ScriptAlias /cgi-bin/ “/var/www/cgi-bin/”
#
# AllowOverride None
# Options None
# Order allow,deny
# Allow from all
#
14.autoindexに関係する設定をコメントアウトする

#IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable
#AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
#AddIconByType (TXT,/icons/text.gif) text/*
#AddIconByType (IMG,/icons/image2.gif) image/*
#AddIconByType (SND,/icons/sound2.gif) audio/*
#AddIconByType (VID,/icons/movie.gif) video/*
#AddIcon /icons/binary.gif .bin .exe
#AddIcon /icons/binhex.gif .hqx
#AddIcon /icons/tar.gif .tar
#AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
#AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
#AddIcon /icons/a.gif .ps .ai .eps
#AddIcon /icons/layout.gif .html .shtml .htm .pdf
#AddIcon /icons/text.gif .txt
#AddIcon /icons/c.gif .c
#AddIcon /icons/p.gif .pl .py
#AddIcon /icons/f.gif .for
#AddIcon /icons/dvi.gif .dvi
#AddIcon /icons/uuencoded.gif .uu
#AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
#AddIcon /icons/tex.gif .tex
#AddIcon /icons/bomb.gif core
#AddIcon /icons/back.gif ..
#AddIcon /icons/hand.right.gif README
#AddIcon /icons/folder.gif ^^DIRECTORY^^
#AddIcon /icons/blank.gif ^^BLANKICON^^
#DefaultIcon /icons/unknown.gif
#ReadmeName README.html
#HeaderName HEADER.html
#IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
15.MIME 言語タイプの適用優先順位(日本語を優先)

LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ..

LanguagePriority ja en ca cs da de el eo es et fr he hr it ko ..
16.CGIスクリプト設定を有効化して拡張子 .pl を追加

#AddHandler cgi-script .cgi

AddHandler cgi-script .cgi .pl
17.保存して終了

ESC
:wq
設定の確認

設定ファイルの編集が終わったら、無事に設定ができているか文法チェックをしてみましょう

[root@ ~]# apachectl configtest

httpd: Syntax error on line 210 of /etc/httpd/conf/httpd.conf: Syntax error on line 2 of /etc/httpd/conf.d/proxy_ajp.conf:
Cannot load /etc/httpd/modules/mod_proxy_ajp.so into server: /etc/httpd/modules/mod_proxy_ajp.so: undefined symbol: proxy_module
なにやら /etc/httpd/conf.d/proxy_ajp.conf にエラーがあるとか言われてしまいました。(他のエラーがあったら記述ミスかもしれないので、httpd.confを確認しましょう)これは proxy_module をOFFにしたせいで mod_proxy_ajp も読めなくなったというエラーです。設定内の記述で、/etc/httpd/conf.d 内の設定ファイル(〜.conf)は自動で読み込まれるようになっているのですが、初期状態で入ってる proxy_ajp.conf も welcome.conf も今回の設定では必要ないので、まとめて読み込まないようにしちゃいましょう。

[root@ ~]# mv /etc/httpd/conf.d/proxy_ajp.conf /etc/httpd/conf.d/proxy_ajp.conf.bk
[root@ ~]# mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.bk
そしてチェック。大丈夫なはずです。

[root@ ~]# apachectl configtest
Syntax OK
最後にhttpdを再起動します。

[root@ ~]# /etc/rc.d/init.d/httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
iptablesの設定追加

80番ポートのパケットを許可するためにiptablesに設定を追加します。

[root@ ~]# iptables -A SERVICE -p tcp –dport 80 -j ACCEPT
iptablesの設定を保存

[root@ ~]# /etc/rc.d/init.d/iptables save
Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
そしてiptablesを再起動して反映させます。

[root@ ~]# /etc/rc.d/init.d/iptables restart
Flushing firewall rules: [ OK ]
Setting chains to policy ACCEPT: filter [ OK ]
Unloading iptables modules: [ OK ]
Applying iptables firewall rules: [ OK ]
Webブラウザで表示の確認

Webブラウザから設定したドメイン、もしくは http://XXX.XXX.XXX.XXX/ にアクセスしてみましょう。
通常、Apacheのインストール直後だとApacheのテストページが表示されるのですが、先ほどhttpd.confの設定でテストページを表示しないように設定してしまったので、「サーバーにアクセスできません」ではなく、「404 Not Found エラー」が表示されればApacheは問題なく起動しています。
ただ、このままではちょっと味気ないのでDocumentRootに簡単なテストページを作ってみましょう。

[root@ ~]# echo ‘HelloHello’ > /var/www/html/index.html
Webブラウザからアクセスして「Hello」と表示されればOKです。

yumを使ったインストールで[is need package....]となってエラーで入らない時

今回はyumでpearをインストールを試みた。

yum --enablerepo=remi,epel php-pear*

すると、エラーが出てどうにもインストールできない。

そのエラーが

is need package....

調べてみるとこれは、パッケージの依存関係でインストールできない模様。

そこで、今のインストールされている若しくはyum管理のphp-pearを調べる

yum --enablerepo=remi,epel info php-pear

これだと何故かrepoがbaseになって古いバージョンが表示されるこの時はpear.1.4.??

なので、色々調べて一時的に下記を変更することで解決できた

vi /etc/yum/plugin.conf.fd/priorities.conf

を開いて

[main]
enabled = 1←を0に変更
vi /etc/yum/plugin.conf.fd/fastestmirror.conf

 [main]  enabled=1←0に変更 verbose=0 socket_timeout=3 hostfilepath=/var/cache/yum/timedhosts.txt maxhostfileage=10 maxthreads=15 #exclude=.gov, facebook
vi /etc/yum/plugin.conf.fd/fastestmirror.conf/downloadonly.conf 

 [main]
enabled=1←0に変更

上記を変更してもう一度実行

yum --enablerepo=remi,epel info php-pear

すると、1.9.??になったので、インストールする

yum --enablerepo=remi,epel install php-pear*

すると

Transaction Check Error:
file /usr/share/pear/.channels/__uri.reg from install of php-pear-excel-0.9.0-1.el5.rf.noarch conflicts with file from package php-pear-1.9.4-3.el5.remi.noarch
file /usr/share/pear/.channels/pear.php.net.reg from....

とエラーが出た・・・・

これは_86_64(64bit)環境に32bitのパッケージをインストールしようとしたことが原因らしいので、_86_64のみをインストールできるようにする。

最後に --exclude=*.i386を追加する

これでインストール完了しました。

Mysqlとディレクトリのバックアップ方法

サーバーを構築して安心しきっていると危ない目に合う可能性が高い。

攻撃とかもそうだと思うけど、もっと基本的な事でバックアップをとってなかったら、費やしていきた時間が消えてなくなる可能性だってある。

だからバックアップはこまめにとりましょう。

と言うことで、CENTOSでのバックアップ方法です。

これも、他のサイト様から引用です。

http://centossrv.com/mysql-backup.shtmlさんからの引用でバックアップ用のスクリプトを作ります。

[root@centos ~]# vi mysql-backup.sh ← MySQLデータベースバックアップスクリプト作成
#!/bin/bash

PATH=/usr/local/sbin:/usr/bin:/bin

# バックアップ先ディレクトリ
BACKDIR=/backup/mysql

# MySQLrootパスワード
ROOTPASS=xxxxxxxx

# バックアップ先ディレクトリ再作成
rm  -rf $BACKDIR
mkdir -p $BACKDIR

# データベース名取得
DBLIST=`ls -p /var/lib/mysql | grep / | tr -d /`

# データベースごとにバックアップ
for dbname in $DBLIST
do
    table_count=`mysql -u root -p$ROOTPASS -B -e "show tables" $dbname|wc -l`
    [ $table_count -ne 0 ] &&
    mysqlhotcopy $dbname -u root -p $ROOTPASS $BACKDIR | logger -t mysqlhotcopy
done

[root@centos ~]# chmod 700 mysql-backup.sh ← rootのみ参照・実行できるようにパーミッション変更

そして、スクリプトを実行してうまくいっているのか確認するのですが、こんなエラーがでました。

[root@centos ~]# ./mysql-backup.sh
DBD::mysql::db do failed: SELECT,LOCK TABL command denied to user ‘root’@'localhost’ for table ‘cond_instances’ at /usr/bin/mysqlhotcopy line 489.

この場合は、下記の内容を追記して解決できます。

# データベースごとにバックアップ
for dbname in $DBLIST
do
[ $dbname = "performance_schema" ] && continue  ←追加
table_count=`mysql -u root -p$ROOTPASS -B -e “show tables” $dbname|wc -l`
[ $table_count -ne 0 ] &&
mysqlhotcopy $dbname -u root -p $ROOTPASS $BACKDIR | logger -t mysqlhotcopy
done

 mysql-backup.shの中身

上記でMYSQLのバックアップは完了です。

最後に毎日実行されるようにcronに入れいます。

echo "0 5 * * * root /root/mysql-backup.sh" > /etc/cron.d/backup

次はディレクトリのバックアップです。

これもhttp://centossrv.com/backup.shtmlさんからの引用です。

まずはバックアプスクリプトを作ります。

[root@centos ~]# vi backup.sh ← バックアップスクリプト作成
#!/bin/bash

#
# ローカル内でバックアップ
#

LANG=C

#
# 設定開始
#

# バックアップ対象リスト名
# ※バックアップ対象をフルパスで記述したリスト
BACKUPLIST=/root/backuplist
[ ! -s $BACKUPLIST ] && echo "$BACKUPLIST is not found" && error_exit

# バックアップ対象外リスト名
# ※バックアップ対象外をフルパスで記述したリスト
BACKUPNOLIST=/root/backupnolist

# バックアップ先ディレクトリ名
BACKUPDIR=/backup
mkdir -p $BACKUPDIR

# バックアップ保存世代数
# ※当日分を含めた過去分バックアップを保存する世代数
# ※過去分バックアップを保存しない場合は1を指定する
BACKUPGEN=8

# 暗号化・復号化パスフレーズ
# ※指定がないときは暗号化しない
PASS=''

# バックアップログファイル名
BACKUPLOG=/var/log/backup.log

#
# 設定終了
#

# 異常終了処理関数定義
error_exit () {
    rm -f $TMPBACKUPNOLIST
    exit 1
}

# バックアップファイルをバックアップ対象外リストに追加
# ※バックアップ先ファイルをバックアップしないようにする
TMPBACKUPNOLIST=`mktemp`
[ -s $BACKUPNOLIST ] && cat $BACKUPNOLIST > $TMPBACKUPNOLIST
echo "$BACKUPDIR/*backup.tar.bz2" >> $TMPBACKUPNOLIST

# 前回バックアップをリネーム
cd $BACKUPDIR
OLDBACKUPFILE=`ls backup.tar.bz2* 2>/dev/null`
if [ -f $OLDBACKUPFILE ]; then
    TIMESTAMP=`ls --full-time $OLDBACKUPFILE|awk '{print $6}'|tr -d -`
    mv $BACKUPDIR/$OLDBACKUPFILE $BACKUPDIR/${TIMESTAMP}$OLDBACKUPFILE > /dev/null 2>&1
fi

# バックアップログファイル作成
rm -f $BACKUPLOG
touch $BACKUPLOG
chmod 400 $BACKUPLOG

# バックアップ実行
echo "`date` backup start" >> $BACKUPLOG
tar cjvfP $BACKUPDIR/backup.tar.bz2 -T $BACKUPLIST -X $TMPBACKUPNOLIST >> $BACKUPLOG 2>&1
code=$?
if [ $code -ne 0 ]; then
    cat $BACKUPLOG | mail -s "BACKUP NG CODE IS $code" root
    rm -f $BACKUPDIR/backup.tar.bz2
    error_exit
fi
echo "`date` backup end" >> $BACKUPLOG

# バックアップ暗号化(暗号化・復号化パスフレーズ指定時のみ)
if [ ! -z $PASS ]; then
    echo "`date` encrypt start" >> $BACKUPLOG
    mkdir -p $HOME/.gnupg
    echo $PASS|gpg --passphrase-fd 0 --batch -c $BACKUPDIR/backup.tar.bz2 > /dev/null 2>&1
	code=$?
	if [ $code -ne 0 ]; then
	    cat $BACKUPLOG | mail -s "BACKUP NG CODE IS $code" root
	    rm -f $BACKUPDIR/backup.tar.bz2*
	    error_exit
	fi
    rm -f $BACKUPDIR/backup.tar.bz2
    echo "`date` encrypt end" >> $BACKUPLOG
fi

# バックアップ保存世代を超えた古いバックアップを削除
if [ $(ls $BACKUPDIR/*backup.tar.bz2*|wc -l) -gt $BACKUPGEN ]; then
    OLDBACKUPCNT=`expr $(ls $BACKUPDIR/*backup.tar.bz2*|wc -l) - $BACKUPGEN`
    for file in `ls -t $BACKUPDIR/*backup.tar.bz2*|tail -n $OLDBACKUPCNT`
    do
        rm -f $file
    done
fi

# バックアップ対象外リスト削除
rm -f $TMPBACKUPNOLIST
 chmod 700 backup.sh
バックアップスクリプト権限付与↑

次にバックアップの対象リストを省くリストを作ります。

今回は下記内容で作成

[root@ ~]# echo "/root" >> backuplist 
[root@ ~]# echo "/etc" >> backuplist
[root@ ~]# echo "/var/www" >> backuplist 
[root@ ~]# echo "/var/lib/gitosis" >> backuplist [root@ ~]# echo "/backup/mysql" >> backuplist

拒否リストは下記で

[root@ ~]# echo "/var/www/error" >> backupnolist
[root@ ~]# echo "/var/www/icons" >> backupnolist

あとは正常に動作するかどうかを確かめます。

 ./backup.sh
で実行する

バックアップが正常にいっている事を確認

ls -lh /backup
tar tjvf /backup/backup.tar.bz2

バックアップした一覧が表示される

そして自動実行するためにcronに登録

echo "0 5 * * * root /root/mysql-backup.sh ; /root/backup.sh" > /etc/cron.d/backup  毎朝5時に実行される 

sshdで突然ログインできなくなった時にした対策

sshで色々さわっている間に、突然ログインできなくなった。

sshdの設定を見てみても何もおかしくないし・・・・少し悩んでいかの方法で解決

/etc/hosts.allow で許可されているホストであれば許可

/etc/hosts.allow で許可されたホストを除き、/etc/hosts.deny で拒否されているホストであば拒否

上記のファイルはsshで不正アクセス等があった時に拒否したり許可したりを設定するファイル。それで、よく見てみると・・・・自分のIPアドレスが登録されていた。

/etc/hosts.denyに!!

安全のためしかたないのかもしれないけど・・・これを削除または#でコメントアウトすれば解決した。

めでたし。めでたし

さくらVPS 設定 4回目

sshのポート番号の変更

ssh のポート番号が標準のままだと、BOTが自動アタックを仕掛けてくるらしいので、変えておきます。前回パスワード認証を無効化したので、自動アタックを仕掛けられてもログインされる事はありませんが、負荷対策の為とログが汚れるのが嫌なので、今回はポートを変更することにしました。

[admin@ ~]$ sudo vi /etc/ssh/sshd_config #Port 22   ↓ Port xxxxx(0 ~ 65535 の任意の番号) 

SSHを再起動して設定を反映させます。

[admin@ ~]$ sudo /etc/init.d/sshd restart Stopping sshd: [ OK ] Starting sshd: [ OK ] 

ポートを変更したので、次回ログインする時は ssh コマンドにポートオプションをつける必要があります。

$ ssh admin@XXX.XXX.XXX.XXX -p xxxxx(上で設定したポート番号)

さくらVPS 3回目

ここからは具体的にサーバーの設定を行う。

ちなみに、ここからの内容は

http://akibe.com/centos-setup-01-login/さんのサイトからの引用です。

ユーザーの設定関係

sshからログインして、ルートのパスワードを変更する。ちなみに、sshのクライアントは、Poderosaを使用する。その他の補足ようとして、WinSCPを使用する。

WinSCPはファイルの移動やコピーするときなどに主に使用する。

 

[root@ ~]# passwd Changing password for user root. New UNIX password: 任意のパスワードを設定 Retype new UNIX password: もう一回入力 passwd: all authentication tokens updated successfully.

上記を実行してルートのパスワードを変更する。

その後、作業用のユーザーを作る

 useradd admin
passwd admin  Changing password for user admin.
New UNIX password: 任意のパスワードを設定
Retype new UNIX password: もう一回入力
passwd: all authentication tokens updated successfully.

新しいパスワードを2回入力すれば設定完了です。
そして「admin」ユーザーを管理者グループに追加します。

usermod -G wheel admin

sudoの設定

作業ユーザーでログインした時に、管理者の権限を使う方法としてユーザー変更の su コマンドでroot ユーザーになる方法がありますが、以下のようなセキュリティ上の問題があります。

  • rootのパスワードを入力する必要がある。
  • 実行したユーザーのログが残らない。
  • 権限の範囲が指定できない。

そのため、より安全な sudo コマンドを使う事が推奨されています。
初期状態ではroot以外のユーザーが sudo を実行することができないので、先程設定した wheel グループでsudoができるように設定を変更します。

[root@ ~]# visudo 

visudo は vi というテキストエディタでファイルを開くコマンドです。vi はOSに標準でインストールされてるテキストエディタで、慣れないうちは使いづらいですが慣れるとシンプルですし、UNIX系ならほぼインストールされているので、覚えておくと便利です。
詳しい説明はしませんが、次のコマンドだけ知っておくと簡単な編集はできるでしょう。

操作 コマンド
1文字削除 x
左に文字挿入 i
右に文字挿入 a
入力モード終了 ESC
UNDO u
最終行に移動 G
保存して終了 :wq
保存しないで終了 :q

ファイル中の下記の部分のコメントアウト文字「#」にカーソル合わせ、 x キーで削除します。

# %wheel ALL=(ALL) ALL   ↓ %wheel ALL=(ALL) ALL 

そして :wq を入力して保存終了します。これで管理者グループの wheel だけが sudo を使う事が可能になりました。

suの設定

wheel グループが設定されたので、su コマンドもグループ内のユーザーだけが使用できるように設定します。

[root@ ~]# vi /etc/login.defs 

先ほどのように vi で設定ファイルが開きます。
そしたら、ファイルの末尾に以下の行を追加して保存してください。

SU_WHEEL_ONLY yes 

これで他のユーザは root になれなくなりました。

公開鍵でのログイン

まずはローカルに非公開鍵と公開鍵のペアを作る必要があります。
今まで「ターミナル」使ってサーバにログインして作業していましたが、鍵ペアを作るためにはローカルで作業する必要があるため、一度ログアウトします。

[root@ ~]# exit Connection to XXX.XXX.XXX.XXX closed. local:~ name$ 

これでローカルに戻ったので、続いて鍵ペアの作成コマンドを実行します。

$ ssh-keygen -t rsa Enter file in which to save the key (/Users/name/.ssh/id_rsa): Enter Enter passphrase (empty for no passphrase): 任意のパスフレーズを設定 Enter same passphrase again: もう一回入力 

これで、 ~/.ssh/ に id_rsa と id_rsa.pub が生成されます。
id_rsa.pub の内容が公開鍵ですが、Finderからは見えないので、viコマンドでファイルを開きます。

$ vi ~/.ssh/id_rsa.pub 

内容をコピーしたら、:q コマンドで保存せずに vi を終了します。

公開鍵の登録

続いて公開鍵をサーバに登録するため、「admin」ユーザーとしてログインします。

$ ssh admin@XXX.XXX.XXX.XXX 

USERNAMEのホームディレクトリの直下に .ssh ディレクトリを作成して、自分だけ読み書き可能に設定します。

[admin@ ~]$ cd $HOME [admin@ ~]$ mkdir .ssh [admin@ ~]$ chmod 700 .ssh 

vi コマンドで、authorized_keys ファイルを作成して、先ほどコピーした公開鍵をペーストして保存します。

[admin@ ~]$ vi .ssh/authorized_keys 

他のユーザーに見られない為に公開鍵ファイルのパーミッションを変更します。

[admin@ ~]$ chmod 600 .ssh/authorized_keys 

これで公開鍵でのログイン設定が完了しました。
最後にrootでのログインとパスワードによるログインを禁止するため、/etc/ssh/sshd_config を編集します。sshd_config ファイルのオーナーは root の為、sudo で実行します。

[admin@ ~]$ sudo vi /etc/ssh/sshd_config 

sudo 初回起動時は説明が表示されたあとにパスワードを聞いてきます。

We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. [sudo] password for admin: adminユーザーのパスワードを入力 

viに入ったら、下記項目のコメントを外して yes を no に変更します。項目の詳しい説明は 日本語マニュアルをどうぞ

#PermitRootLogin yes   ↓ PermitRootLogin no #PasswordAuthentication yes   ↓ PasswordAuthentication no UsePAM yes   ↓ UsePAM no 

SSHを再起動します。

[admin@ ~]$ sudo /etc/init.d/sshd restart Stopping sshd: [ OK ] Starting sshd: [ OK ] 

これで、リモートコンソールからと、秘密鍵を持ったPCから作業ユーザーでログインすることしかできなくなりました。

コマンドのパス設定

admin ユーザーでログインした状態でシステム系のコマンドを簡単に実行する為に、バイナリファイルへのパスを設定します。

[admin@ ~]$ vi ~/.bash_profile PATH=$PATH:$HOME/bin   ↓ 上記の下に以下を追加 PATH=$PATH:/sbin PATH=$PATH:/usr/sbin PATH=$PATH:/usr/local/sbin 

パス設定を反映させます。

[admin@ ~]$ source ~/.bash_profile 

root宛メールの転送

いろいろなサービスを起動すると、root宛にメールが送られるようになります。rootでログインして

[root@ ~]# mail 

で確認してもいいのですが、rootでのログインを減らす為にも、普段使用しているメールに転送すると楽です。

まず、旧root宛メール転送設定を削除し、

[root@ ~]# sed -i '/^root:/d' /etc/aliases 

普段使用しているメールアドレス(例:xxx@xxx.com)宛に転送設定し、

[root@ ~]# echo "root: xxx@xxx.com" >> /etc/aliases 

転送設定を反映させます。

[root@ ~]# newaliases 

最後にroot宛にテストメールを送信します

[root@ ~]# echo test|mail root 

テストメールが転送先に届いていれば完了です。
※ さくらのVPSの場合、試用期間中は外部へのメール送信はできないので、本契約後に確認しましょう。