CentOS上でコマンドラインでメールを送る方法

まず、メール送信サーバーとしてPostfixをセットアップします。Postfixのインストールと設定については以下のこちらの記事を参考にしてください。

CLIのメールクライアントコマンド「mail」がCentOS 6ではデフォルトでインストールされていなかったので以下のコマンドでインストールします。

sudo yum install mailx

 

メールを送るときには以下のように送り先のメールアドレスを指定してmailコマンドを実行します。

mail hoge@hoge.com

このコマンド後、Subjectと本文の入力が促されます。本文を入力し終えたら改行して半角ピリオドを打てばメールが送信されます。

意外と簡単ですね。

 

環境

CentOS 6.2

Heirloom Mail version 12.4

 

CentOS – セキュリティ

不正アクセス防止のためのセキュリティ対策のメモです。

 

iptables関連

▼特定のIPからのアクセスを遮断する
sudo /sbin/iptables -A INPUT -s [IPアドレス] -j DROP

※iptablesにはポリシーの適用に優先順位があるので設定内容に注意!
上記のコマンドを実行する代わりに/etc/sysconfig/iptablesを編集する方法もあります。

 

環境

CentOS 6.2

 

SSH経由でMySQLの準同期レプリケーションを行う方法

SSHで暗号化された通信経路でMySQLの準同期レプリケーションを行うための方法を紹介します。今回使用したMySQLのバージョンは5.5.30です。

 

1. マスタとスレーブと間でSSH経由で通信ができるようにする

レプリケーションの設定に入る前に、マスタDBがあるサーバー(以降、マスタと表記)とそのレプリケーション先のDBがあるサーバー(以降、スレーブと表記)の間の通信がちゃんとできるか確認しましよう。

 

------- スレーブでやること ----------
まず、以下のコマンドを実行してSSHポートフォワーディングによってスレーブの10000ポートからマスタの3306ポートにアクセスできるようにします。
ssh -f -N -C -L 10000:localhost:3306 user01@master.tamurasouko.com -p 22

上記のコマンドで下図のようなポートフォワーディングを実現しています。このコマンドの詳細についてはこちらのメモを参考にしてください。
ssh_master_and_slave

 

-------マスタでやること ----------
次に、マスタDBにMySQLクライアントで接続し、以下のコマンドでレプリケーション用のユーザを作成します。
mysql> GRANT REPLICATION SLAVE ON *.* TO slave_user@'localhost' IDENTIFIED BY 'slave_password';

上記のコマンドにはちょっとしたポイントがあります。それはユーザ(slave_user)のホストlocalhostにしている点です。

変だとおもいませんか?マスタに接続してレプリケーションを行うのは外部サーバーのスレーブなのに、マスタへの接続に使用するユーザのホストをスレーブではなく、localhost、つまりマスタ自身にしているところが一見おかしいように思えます。

このような設定にしているのはSSHのポートフォワーディングを利用しているためです。ポートフォワーディングはスレーブのlocalhostから通信を「転送」しているため、その通信を受け取ったマスタもlocalhostからの通信だな、と判断するわけです。(たぶん。このあたりの理解はあやしいです。)

レプリケーション用のユーザの作成が完了したら、以下のコマンドをMySQLクライアントで実行して作成したユーザをDBMSに反映させます。
mysql> FLUSH PRIVILEGES;

 

------- スレーブでやること ----------
ここまで設定が終わったら、スレーブからマスタにポートフォワーディングで接続できるか以下のコマンドを実行して確認します。
mysql -u slave_user -p -h 127.0.0.1 --port=10000

問題なく実行できればOKです。

 

2. 準同期レプリケーションのための設定をする

マスタ・スレーブ間の通信ができることを確認したところで、レプリケーションの設定をMySQLの設定ファイル(/etc/my.cnf)に記述していきます。設定はマスタ、スレーブそれぞれ行う必要があります。以下の設定を追記したらMySQLサーバーを両方とも再起動してください。

マスタのmy.cnf

# サーバーID
server-id=10

# バイナリーログファイルを生成
log-bin
# ログの保持を保証する期間
expire_logs_days=14

# レプリケーションプラグイン(マスタ用)を読み込む
plugin-load=rpl_semi_sync_master=semisync_master.so

# このサーバーをレプリケーションのマスタに指定
rpl_semi_sync_master_enabled=1
# スレーブから応答が帰ってこない場合の待ち時間を指定(ミリ秒)
rpl_semi_sync_master_timeout=1000

 

スレーブのmy.cnf

# サーバーID(※マスタより大きな値を設定)
server-id = 11

# レプリケーションプラグイン(スレーブ用)を読み込む
plugin-load=rpl_semi_sync_slave=semisync_slave.so

# このサーバーをレプリケーションのスレーブに指定
rpl_semi_sync_slave_enabled=1

 

3. データのコピーとログ位置を確認する

レプリケーションを始める前にマスタとスレーブのデータが同一である必要があります。そのためにマスタDBの全データをダンプ(別ファイルに書き出すこと)し、そのダンプデータをスレーブにコピーします。

 

------- マスタでやること ----------
まず、マスタのDBがこのコピー作業中に変更されないようにMySQLクライアントから以下のコマンドを実行し、ロックします。
mysql> FLUSH TABLES WITH READ LOCK;

この状態で以下のコマンドをシェルから実行し、マスタDBの全データをダンプします。
mysqldump -u root --password='root_password' --all-databases --master-data --events > all_dump.db

また、このときのバイナリーログの位置を以下のコマンドをMySQLクライアント上で実行して取得します。このログ位置はスレーブにてレプリケーションマスタを設定するときに使用します。(後述します)
mysql> SHOW MASTER STATUS;

ここまでの作業が終わったら、以下のコマンドでロックを解除します。
mysql> UNLOCK TABLES;

ここまでがマスタ側での作業です。

 

------- スレーブでやること ----------
次に、マスタDBのダンプデータをSFTPなどを用いてスレーブにもってきます。そして以下のコマンドを実行してスレーブDBにマスタDBのデータを投入します。
mysql -u root ---password='root_password' < all_dump.db

 

4. スレーブにレプリケーション先を設定する

------- スレーブでやること ----------
マスタとスレーブのデータが同一になったところで、スレーブにレプリケーション元のマスタを設定します。スレーブで以下のコマンドを実行します。
mysql> CHANGE MASTER TO master_host='localhost', master_port=10000, master_user='slave_user', master_password='slave_password', master_log_file='mysqld-bin.000001', master_log_pos=2530

SSHポートフォワーディングによってマスタに接続するため、コマンドのmaster_hostやmaster_portの値は上記のようになります。また、前節においてマスタでSHOW MASTER STATUSコマンドを実行して得られたログ位置をmaster_log_posの値として設定しています。

 

5. レプリケーション開始

------- スレーブでやること ----------
スレーブで以下のコマンドを実行すれば準同期レプリケーションが開始されます。
mysql> START SLAVE;

 

6. レプリケーションが行われているか確認

------- スレーブでやること ----------
実際にマスタを更新してデータがスレーブにも更新されるか見て確認してもいいですが、以下のコマンドをスレーブ側で実行して確認することもできます。(両方やっておけば確実です)
mysql> SHOW SLAVE STATUS\G

上記のコマンドを実行すると、Slave_IO_RunningSlave_SQL_Runningという項目が表示されます。これらがどちらもYesになっていればOKです。

 

環境

CentOS 6.4
MySQL 5.5.30
openSSL 1.0.0

 

 

SSHのポートフォワーディングでMySQLに接続する方法

SSHポートフォワーディング(トンネリング)を利用して、外部サーバーで稼働しているMySQLデータベースに接続する方法を紹介します。

 

SSHポートフォワーディングとは

ssh_portforwarding

SSHポートフォワーディングの仕組みがわかってしまえば、今回の話は簡単です。要は上図のように、SSHによって確立された通信経路を利用してクライアントの10000ポートをサーバーの3306ポートにマッピングするわけです。

つまり、このポートフォワーディングが行われているときにクライアントのローカルの10000ポートに接続すれば、サーバーの3306ポートに接続していると変わらないというわけです。

しかも、このとき通信経路はSSHによって暗号化されおり、また接続先のポートがファイアウォール等で閉じられていたとしてもSSHのポートさえ開いていれば利用可能という非常に使い勝手がよい仕組みになっています。

 

ポートフォワーディングを実行する

では、さっそくSSHポートフォワーディングをやってみましょう。以下のコマンドを実行してください。
ssh -f -N -C -L 10000:localhost:3306 user01@xxx.tamurasouko.com -p 22

上記のコマンドを解説します。まずの"-L 10000:localhost:3306"の部分ですが、これはローカルの10000ポートを接続先サーバーの3306ポートにマッピングする、という指定です。次に、"user01@xxx.tamurasouko.com -p 22"の部分では、xxx.tamurasouko.comというサーバーの22ポートにユーザ名user01で接続する、という指定です。この22というポートはSSHの接続を待ち受けているサーバーのポート番号になります。
また、オプションの意味はそれぞれ以下の通りです。

オプション 説明
-f このポートフォワーディングをバックグラウンドで実行する。(必須
-N SSHトンネリングのみに使用する。(必須
-C データを圧縮して送る。

尚、ポートフォワーディングを停止したい場合はps aux|grep sshコマンドで当該プロセスを探し、killすればいいだけです。

 

外部サーバーのMySQLに接続する

外部サーバーの3306ポートでMySQLが通信を受け付け、かつ上記のポートフォワーディングが行われている場合、クライアントは次のコマンドで外部サーバーのMySQLに接続できます。
mysql -u root -p -h 127.0.0.1 --port=10000

portオプションでポートフォワーディングの窓口として設定したローカルの10000番ポートを指定すれば外部サーバーで稼働しているMySQLに接続することができます。

ちなみに"-h 127.0.0.1"を指定していないとうまくフォワーディング できませんでした。-hオプションは接続先を指定するオプションですが、上記の例ではローカルホストの10000ポートを窓口としてサーバーの3306ポートに接続しているわけですから、明示的に接続先がローカルホストであることを示す必要があります。

 

以上になります。今回はMySQLサーバーへに接続でしたが、SSHのポートフォワーディングは他にもいろいろ応用ができそうですね。
⇒ 応用例:[SSH経由でMySQLの準同期レプリケーションを行う]

 

環境

CentOS 6.4
MySQL 5.5.30
openSSL 1.0.0

 

rsyncの使い方

SSH経由で同期処理が可能なとっても便利なコマンド「rsync」の使い方のメモです。

 

基本

rsync -r ~/data/ bbb.tamurasouko.com:~/sync_data/
ホームディレクトリのdataディレクトリ配下のファイルを、リモートサーバー(bbb.tamurasouko.com)のホームディレクトリにあるsync_dataディレクトリ配下に同期(コピー)します。-rオプションをつけないとディレクトリ配下のファイルを再帰的に同期してくれないので、ほとんどの場合、このオプションを付けることになります。

 

SSHのポート番号を指定

セキュリティ対策の一環として、SSHのポート番号を変えていることがあると思います。その場合は以下のようにしてリモートサーバーのSSHのポート番号を指定します。
rsync -e "ssh -p 3862" -r ~/data/ bbb.tamurasouko.com:~/sync_data/

 

注意点

rsyncはcronを使って定期的に自動実行する場合が多いと思いますが、SSHの鍵にパスフレーズがついていると、rsync実行時に毎回パスフレーズの入力が求められるため、自動化ができません。この問題への手っ取り早い対策は、SSHの鍵の生成時にパスフレーズを指定しないことです。

えっ?パスフレーズなしで大丈夫なのかって? 大丈夫です。秘密鍵が漏れない限り心配いりません。私もつい最近まで勘違いしていたのですが、パスフレーズはSSHの鍵の生成の「種」として使われるのではなく、別なレイヤーでの保護措置に使われるものだからです。えっ?別なレイヤーって何かって? えーと、それは。。

 

環境

CentOS 6.4
rsync 3.0.6

 

yumの使い方

よくyumにはお世話になるのですが、使い方を忘れてしまうのでメモ。

▼インストール済みのパッケージを確認する
yum list installed

▼利用可能なアップデートがあるか確認する
yum list updates

▼レポジトリを指定する
yum install [パッケージ名] --enablerepo=[レポジトリ名]
このオプションはupdateなど他のコマンドでも利用できます。

▼パッケージの詳細を確認する
yum info [パッケージ名]
パッケージをインストールする前にバージョンなどを調べるときに便利です。

▼yumで管理されているパッケージに更新があるかチェック
yum check-update

▼yumで管理されている全てのパッケージの最新化
yum -y update

 

Monitによるサーバー監視

Monitというモニタリングソフトを使ってみました。導入も設定も簡単でした。

 

インストール

yumを使えば簡単です。以下のコマンドを実行すればインストールは完了です。
sudo yum install monit

 

基本設定

/etc/monit.confファイルに以下の設定を記述するだけで、問題なく動作します。

# 120秒ごとに監視を行う
set daemon  120
# アラートメールの送信サーバーを指定(※Gmailを使用する場合の例)
set mailserver smtp.gmail.com port 587 username "あなたのGmailアドレス" password "あなたのパスワード" using tlsv1
# Webブラウザからモニタリング状況を確認できるようにする
set httpd port 2812 and
    allow admin:monit

上記の5行目の設定によって、"http://[Monitが動作しているサーバーのアドレス]:2812"というURLにアクセスすることでモニタリング状況がWebブラウザから確認できます。このときユーザIDをパスワードを求められますが、それぞれ"admin"と"monit"と入力すればログインできます。

 

起動・終了

yumを使ってインストールした場合、Monitをデーモンとして起動するスクリプトが/etc/init.d配下にあるので、このスクリプトを利用します。
起動: sudo /etc/init.d/monit start
終了: sudo /etc/init.d/monit stop

 

監視設定

以下は「www.tamurasouko.comというWebサーバーの80番ポートに接続できるか監視を行い、できなければアラートメールを送信する」という設定の例です。この設定は/etc/monit.confに記述しても動きますが、個別設定用に/etc/monit.dというディレクトリが準備されているので、そこに別ファイルとして保存したほうが管理しやすいと思います。

check host www.tamurasouko.com with address www.tamurasouko.com
      if failed port 80 protocol http
      then alert

 

環境

CentOS 6.3

 

Linux – よく使うコマンド

このメモは随時アップデートしてきます。

▼シンボリックリンクを作成する
ln -s [ファイルもしくはディレクトリのパス] [リンク名]

▼展開先を指定してtar.gzファイルを展開する
tar zxvf [tarファイルへのパス] -C [展開先の相対パス] ※tar.gzファイルではなく、tarファイルを展開する場合はzオプションは不要

▼展開時に相対パスで出力されるtar.gzファイルを作成する
/data/www/tamura というディレクトリがあるときtamuraディレクトリを起点として圧縮ファイルを作成したい場合は以下のようにする。
cd /data/www
tar czf ~/Backup/tamura.tar.gz ./www

▼拡張子bz2の圧縮ファイルを展開する
bunzip2 [圧縮ファイル]
※逆にbz2の圧縮ファイルを作成する場合は-zオプションを付ける

▼SFTPでポートを指定して接続する
sftp -oPort="[ポート番号]" [接続先アドレス]

▼プロセスごとのメモリ使用量を表示する
ps alx | awk '{printf ("%d\t%s\n", $8,$13)}' ※単位はKB

▼ディスクの空き容量を確認する
df -h

▼メモリの使用状況を確認する
free
オプション:
-m MB単位で表示
-k KB単位で表示

▼RSA暗号方式で公開鍵と秘密鍵を生成する
ssh-keygen -t rsa

▼ファイルの中身を空にする(※ログファイルを空にしたいときなどに便利)
cp /dev/null [ファイル]

▼cronの設定画面を表示する
crontab -e

▼OpenSSLを使ってファイルを暗号化する
openssl enc -e -aes256 -in [対象ファイル] -out [出力先ファイル] -k [パスワード]

▼OpenSSLで暗号化されたファイルを復号する
openssl enc -d -aes256 -in [対象ファイル] -out [出力先ファイル] -k [パスワード]

▼あるディレクトリの容量を見る
du -sh [対象のディレクトリ] 

▼プロセスの優先度を設定する
renice -n [優先度] -p [PID]
優先度は-20〜19であり、値が小さいほど優先される。デフォルトの優先度は0。

▼プロセスの優先度を設定してコマンドを起動する
nice -n [優先度] [コマンド] 

 

 

SSL通信ができるようにnginxを設定する

CentOS 6.3 で動作しているWebサーバー「nginx」でSSL通信を行うための方法を紹介します。

1.環境の確認
まず、インストールされているnginxがSSL通信に対応しているか確認します。

/opt/nginx/sbin/nginx -V

上記のコマンドを実行して、
nginx: TLS SNI support disabled
という表示があった場合にはSSL通信ができません。最新のnginxとopenSSLをインストールすることで、この問題を解決することができます。nginx 1.2.4 とopenSSL 1.0.0ではSSL通信を行うことができました。

ちなみにnginxとopenSSLのバージョンの確認は以下のコマンドで行うことができます。

/opt/nginx/sbin/nginx -v  # nginxのバージョンを確認
openssl version # openSSLのバージョンを確認

 

2.証明書の作成(または取得)
本来はSSLサーバ証明書を発行してくれる承認会社から証明書を発行してもらって、その証明書をサーバーに配置するのですが、お金も手間もかかるので、ここでは自分でSSLサーバー証明書を作成します。いわゆる「オレオレ証明書」です。ただ、最近は無料ですぐにSSL証明書を発行してくれる「startSSL」なるものもあるので、そちらを利用するのもいいかもしれません。

/etc/pki/tls/certsディレクトリに移動します。ここにあるMakefileに証明書の有効期限の指定などの設定があるので、SSL証明書についての設定はこのファイルを編集することで行えます。とりえあず、試してみるだけならデフォルトの設定で問題はないので、以下のコマンドを入力して証明書を作成します。

> make tamurasouko.crt
Enter pass phrase:[パスフレーズを入力]
Verifying - Enter pass phrase:[パスフレーズを入力]
-----
Country Name (2 letter code) [XX]:[国名を入力。日本ならJP]
State or Province Name (full name) []:[県名を入力]
Locality Name (eg, city) [Default City]:[市町村名を入力]
Organization Name (eg, company) [Default Company Ltd]:[会社名を入力]
Organizational Unit Name (eg, section) []:[部署名を入力]
Common Name (eg, your name or your server's hostname) []:[ドメイン名を入力]
Email Address []:[メールアドレスを入力]

上記の処理が完了すると、tamurasouko.crt(公開証明書)とtamurasouko.key(秘密鍵)が生成されます。

 

3.nginx側の設定
SSL証明書が準備できたら、nginxのconfファイルを編集してSSL証明書を読み込むようにします。/opt/nginx/conf/conf.d配下にある設定ファイルを以下のように編集します。

server {
    # SSLの設定
    listen 443;
    ssl on;
    ssl_certificate      /etc/pki/tls/certs/tamurasouko.crt;
    ssl_certificate_key  /etc/pki/tls/certs/tamurasouko.key;

    server_name www.tamurasouko.com;

    root /opt/nginx/html/www;
}

上記はSSL通信をするための最低限の記述になります。この設定が完了したらnginxを再起動していください。この際、パスフレーズが求められることがありますが、その場合はopenSSLで証明書を作成したときに入力したパスフレーズを入力してください。

以上で設定は完了です。

 

(はずかしい)こぼれ話
実は、SSLの設定をしていたときに最初どうしてもうまくいきませんでした。2時間ほどネットの海をさまよい、いろいろ調べたのですが原因がわからず途方にくれていました。

気分転換にコーヒーを入れているときに、ふとiptablesでポートを塞いでいたことを思い出し、443ポートを開けてみたところ、できました…。