Ubuntu 管理系の tips

知らんかったことをメモる.

linux-image は,新しいものを入れても古いものが残る.
apt-get autoremove で昔は消えていたが,最近は消えないらしい.
dpkg -l | grep linux-image として,出てくる 2つ前までのものは remove で消しても良いかも.
今のカーネルは,/proc/version を見るか,uname -r

apt による管理では,remove しても,設定ファイルが残る.
設定ファイルも消す時は,purge

その他の設定は,Ubuntu Server で単純にパッケージを削除しても設定ファイルは残る、残った設定ファイルを一括削除するには? | レンタルサーバー・自宅サーバー設定・構築のヒント を参考にすると良いかも.

dovecotの設定

  • apt-get install dovecot-imapd
    でインストール
  • /etc/dovecot/dovecot.conf へ listen = * を追記
  • /usr/share/dovecot/protocols.d/imap.protocol は protocols = imapがあればOK
    (dovecot 1.x とは異なり,2.x では pops とか imaps はプロトコル名として定義されていない)
  • conf.d/10-master.conf で,imaps のみ有効にしたい時は,imap-login の inet_listener imap でport=0と指定する.
    pop3 を殺す時は,inet_listener pop3-login のブロックを丸ごとコメントアウトすると共に,service pop3 のブロックもコメントアウトする.
  • conf.d/10-ssl.conf で,ssl = yes としつつ,cert,key,ca を指定する. "<" を path の直前に入れるのを忘れがちなので注意.
    ssl_key にパスワード付の鍵を使う場合,ssl_key_password で指定できる.
  • 必要に応じて,conf.d/10-logging.conf にログファイルを指定.基本的には,log_path を指定しておけばOK
  • その他,メモ
    • imapd: IMAPサーバ
    • sieve: メール振り分けの規格…らしい
    • lmtpd: メール配送プロトコル…らしい

cram-md5 を指定すると,何故かうまく動作しなかったので入れてない.md5 関連の何かパッケージが入ってないのだと思うけど,面倒くさいので放置.ssl でいいよ.

今後やりたいことは,

  • ローカルメール配送も dovecot にさせる
  • imaps 内で plain で認証かけている場合,本当に平文が流れていないかパケットキャプチャ

sshd 設定メモ

設定したものの中で知らなかったものや,設定してないけど man を読んで気になったものをメモ.
ssh v1 は使ったことないので,知らない.

設定項目 意味とか
Port セッションを受け付けるポートの指定.複数行記述することで,複数のポートで待てる.
UsePrivilegeSeparation sshの子プロセスの権限をユーザー `sshd' (yesの時) とするか,`root' (noの時) とするか.
LoginGraceTime ログインプロセスのタイムアウト.これ以上時間が経過してもユーザー名とか入れなかったら落ちる.
StrictModes 鍵の置いてあるところ (/home) の o に w 権限が付与されていたら拒否する.
RSAAuthentication ssh v1 の RSA 公開鍵認証の許可.
PrintMotd /var/run/motd の中身をログイン時に表示するか否か.yes だと表示するが,ログインメッセージが 2回表示されてしまう場合があるらしい.
TCPKeepAlive (ssh の man より)
(ClientAliveCountMax の項より) The TCP keepalive option enabled by TCPKeepAlive is spoofable.
(TCPKeepAlive の項より) Specifies whether the system should send TCP keepalive messages to the other side. If they are sent, death of the connection or crash of one of the machines will be properly noticed. However, this means that connections will die if the route is down temporarily, and some people find it annoying.
つまり,暗号化セッションの外で ack を投げる設定であって,途中経路で 1 回途絶えたら落ちて,ack の乗っ取りができるというもの.
ClientAliveCountMax (ssh の man より)
If this threshold is reached while client alive messages are being sent, sshd will disconnect the client, terminating the session. (中略) The client alive messages are sent through the encrypted channel and therefore will not be spoofable.
つまり,この数だけ ack が落ちたら切断するよ.TCPKeepAlive と違って乗っ取りされませんよ.という keepalive のこと.
ClientAliveInterval ClientAliveCountMax で言う ack が落ちる,の定義秒.
MaxStartups 認証セッションの許可数.x:y:z の形式で指定するもので,x セッションまでは 100% 受け付けるが,x+1 セッションからは確率 y で拒絶し,z セッションに達するまで拒絶率が線形に増加し,z セッションに達した後には全てのセッションを拒絶する,というパラメタ.
MaxAuthTries 1回の接続における認証のリトライ数の上限.
MaxSessions ssh は 1 接続で複数セッションを貼って通信ができ,その上限.具体的に,どのように動作に効いてくるかは不明…

あんま設定を載せたくないので,具体的にどうしてるかは秘密だけど,かなり固めに設定したと思う.
毎回,設定後に sshd を restart して,再接続を試験する時は緊張するぜ…勿論,既設のセッションは 1 つは残してテストするけど…接続できなくなった時の事を考えると怖い.

Ubuntu Server の auth.log に定期的に出力されるログ

我が家のサーバーでも、この記事とモロに同じことが起こっていた。
cron と anacron | ちりぢりな記憶の寄せ集め
もうひとつの cron | ちりぢりな記憶の寄せ集め

17分のログは記事の通りで、/etc/crontab に記載された、/etc/cron.hourly を呼び出すルーチンのログだということが分かった。
9分と39分のログも記事の通りで、/etc/cron.d/php5 に記載されたルーチンのログっぽい。
なお /etc/cron.d/php5 のログは、php5 の GC らしい。sessionとgc [wiki.catatsumuri.org]
ということで、今回は意外とあっさり分かって良かった。

WinSCP を使って Win から Linux サーバのバックアップ

前提:

  • Linux サーバを多重化したり RAID を組む予算がないために,シングル構成をとらざるを得ない.
  • Win マシン上には大事なデータがあるので多重化している.
  • Linux サーバには,SSH 公開鍵を使った入力レスの SSH セッションが疎通.
  • Win マシン上には WinSCP 導入済.

準備1 Linux サーバ

バックアップしたいパスを決定し,アーカイブを自動化.
例)cron 利用

# crontab -l
0 10 * * * rm /bkup/var.cache.bind.zip;zip -P `cat ZIPPWDFILE` -rq /bkup/var.cache.bind.zip /var/cache/bind
0 40 * * * mysqldump -u MYSQLUSER -p`cat MYSQLPWDFILE` --opt DBNAME --net_buffer_length=8000 | gzip > /bkup/mysql.sql.gz

準備2 Winマシン

  • WinSCP で動作させるスクリプトの作成.
    例)ファイル名「backup_script」とする.

    open PAMUSER@host.domain -privatekey="c:\PATH\.ssh\id_rsa.ppk"
    cd /bkup
    lcd c:\STORAGEPATH
    get var.cache.bind.zip mysql.sql.gz .\
    exit
    
  • WinSCP を呼ぶスクリプトの作成.
    例)ファイル名「backup.bat」とする.

    c:\PATH\winscp437\winscp.com /script=c:\PATH\backup_script
    

実施

  • backup.bat を実行する.

追記(Feb 13 2013)
info-zip の場合, –f オプションで差分だけ上書きできるよ!(新規ファイルの追加はなし)
更新(上書き+新規追加)したい時は,–u オプションでいいよ!
消えたファイルはアーカイブからも消したい時は,–FS オプションでいいよ!
–x オプションで除外できるよ!
除外リストでワイルドカードを使う時は,\ でエスケープしないといけないよ!

apache2 の設定メモ

毎回,OS を入れ直す度に忘れるので,今回こそはきちんとメモるぞー.
記事の趣旨が趣旨なので,この記事は随時アップデートされると思う.

前提

LAMP サーバが入った状態で Ubuntu server をインストールしたことが前提.
自分しか使わないサーバなので,mod_php5 で勘弁する.
(この後の予定) SSL 対応と,vhost 対応.←済

設定

  • dir.conf を編集して,いらん index ファイル指定を消す.
  • userdir を使うので,有効化する.
    # a2enmod userdir
    良く考えたら,VirtualHost を使うので,なくて良い気がする.
  • php5 自体は有効化されているが,userdir では無効になってるので,有効化する.
    php5.conf を開いて,userdir のディレクティブに記述されている,php_admin_value engine Offをコメントアウト.
  • directory 内のファイルリストが見えるのは困ることがあるので,デフォルトオフにしておく.
    userdir.conf の Indexes を削除.
  • 多言語対応は,userdir.conf の MultiViews を有効にしておいて,hoge.html.ja hoge.html.en とかを用意する.
    ユーザーが hoge.html にアクセスした時,その人の言語優先度に従って表示するファイルが選択される.
    更新し忘れが多発しそうなので,管理はそれなりに考えないといかんかも.
  • favicon の設定に,rewrite モジュールを使う.
    # a2enmod rewrite
    ただし,RewriteEngine を使う場合,AllowOverride FileInfoと,Options SymLinksIfOwnerMatch辺りを
    許可しておかなければならないので,要注意.
  • DocumentRoot が /var/www とかになっているため,絶対パスで / から指定しているリンクが悉く死ぬ.
    DocumentRoot を変更しても良いけど,最終的に userdir でアクセスさせないので, sites-available に VirtualHost の設定を書いた方が良い.
  • VirtualHost ディレクティブの ErrorLog は,ログ出力先.
    LogLevel は,ログ出力レベル.指定するレベルはググること.
    CustomLog は,アクセスログの出力先.
  • VirtualHost ディレクティブでは,ServerName を指定しないと apache2 が warn を吐くが,
    設定していたとしても,サーバの hostname.domainname と一致していないと同様に warn を吐く.
    設定は,/etc/hostname を FQDN で書いてしまい,networking の restart でとりあえず動く.(←動かない時は,再起動したら動いたりする)
  • ServerTokens ディレクティブや ServerSignature ディレクティブは,conf.d/security に書かれているので,この後に読まれるよう記載する.
    ServerTokens では HTTP のヘッダの出力のサーバ情報の出力を制御でき (ErrorDocument も,この制御された token を出力する),
    ServerSignature ディレクティブでは ErrorDocument 下部のサーバ情報の出力を制御できる.
  • php のヘッダー出力の抑制は,php.ini で行なう.
    /etc/php5/apache2/php.ini の expose_php を Off とする.
  • digest 認証はモジュールをロードさせないといけない.
    # a2enmod auth_digest
  • deflate モジュールでファイルを gzip 圧縮して転送できるが,転送サイズがファイルサイズより大きいことがある.
    その時は,SSI とか PHP とかで include していないか思い返してみること…
    これでハマった.
  • SSL対応。
    署名要求ファイルを当該サーバ上で生成して、証明機関に送信して証明書が作成される。
    まずは、署名要求ファイルの作成から。

    1. 秘密鍵を作成する。
      openssl genrsa -aes256 2048 > server.key

      秘密鍵は、パスフレーズで保護する。
      server.key が秘密鍵。

    2. 秘密鍵を使って、署名要求ファイルを作成する。
      openssl req -new -key server.key > server.csr
      openssl req -new -sha256 -key server.key -out server.csr # sha-2署名を要求する
      秘密鍵のパスフレーズを求められるので、入力する。
      証明書へ埋め込みたい情報の入力が求められるので、入力する。
      とりわけ、Common Name は使いたい web site のホスト・ドメイン名と一致させておくこと。
      server.csrが署名要求ファイル。
  • 続いて、StartSSL を例にドメイン名の検証 (validation) を行なう。
    詳しくは、[無料 SSL 証明書 StartSSL を使う](http://futuremix.org/2009/02/startssl)などを参照。

    1. サインアップから名前とか住所とかを登録。
    2. クライアント証明書をインストール。(次回からのログインにはクライアント認証が必須)
    3. ドメイン名検証を通過させる。独自ドメインのメールか、ドメイン登録に使っているメールの受け取り環境が必要。
  • web サーバの検証を行なう。
    1. 登録済みサブドメインの失効は有料といわれたので、ここで手順は中止。HW 交換したら、全てのキーを保存しておかんといかんなぁ。。。
    2. 別ドメインを建ててみる.
      CSR ファイルを作る画面が出てくるが,ローカルで作成しているので skip する.
    3. トップレベルドメインは,検証済のドメインを選択する.
      次にサブドメインを入力させられるので,検証させたいサブドメインを入力する.
    4. Save Certificate という画面で,crt ファイルの中身が出てくるので,
      コピーして server.crt とかのファイル名でテキストファイルにペースト.
      改行コードは LF.
    5. 同じ画面からリンクされている「intermediate」と「root」の CA certificates をダウンロードする.
  • web サーバの設定
    1. /etc/apache2/ports.conf を編集し,mod_ssl.c のモジュール設定の部分に,
      NameVirtualHost *:443
      とか書いておく.Listen が書かれてなければ,Listen 443 も書いておく.
    2. これまで準備したファイルのうち,必要なものを配置.
      /path に放り込んだとすると,次のファイルが必要.
      /path/server.key
      /path/server.crt
      /path/sub.class1.server.ca.pem (← intermediate CA Certifications)
      /path/ca.pem (← root CA Certifications)
    3. SNI を定義しているファイル (site-enabled にあると思われる) の中で,
      ssl 用の設定を書く.
      その中で,配置したファイルを指定する.ついでに簡単な雛形も載せておく.

      
              ServerAdmin     MAIL_ADDR
      
              DocumentRoot    ROOT_DIR
              ServerName      DOMAIN_NAME
              SSLEngine       on
              SSLCertificateFile      /path/server.crt
              SSLCertificateKeyFile   /path/server.key
              SSLCertificateChainFile /path/sub.class1.server.ca.pem
              SSLCACertificateFile    /path/sslfiles/ca.pem
              
                      ...
              
              
                      ...
              
      
              ...
      
      
  • 上述のままだと,apache 起動時に server.key のパスフレーズを求められる.
    自動リブートとかさせていると問題があるので,解除する.

    # openssl rsa -in  server.key.org > server.key

-- 追記
いつからか,apache2 の再起動時に,以下のエラーを吐くようになった.
いろいろと対処しているうちに名前解決が怪しいと気付き,syslog を見て原因が分かった.
ホスト名を変更した時に,旧ホスト名を現ホスト名の CNAME にしたにも関わらず,ローカルに立てている DNS の SOA レコードとか NS レコードとかもろもろを書き換え忘れていたことが原因.

httpd: apr_sockaddr_info_get() failed for hoge.hadacchi.com
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

どうやらこれは,二つのエラーを意味しているようだ.
多分
1行目:ServerName の設定がないから自分で取ろうとしたけど,うまくいかないぜ!
2行目:なんか,ちゃんとした答えが得られないから,これこれを ServerName に使うぜ!
とうことなんだろうと思う.対応とその結果を書いておく.

  • 対処1:自分の使用しているホスト名 (# hostname -f で表示されるものの FQDN) を /etc/hosts の 127.0.0.1 の別名として併記する.
    ただし,今回のように bind の設定ミスがある場合は,hostname -f でエラーが返る.

    • 結果1:1行目のエラーのみ消え,2行目の 127.0.0.1 の部分が,/etc/hosts に設定したホスト名となる
  • 対処2:(VirtualHost を使っているとしても) httpd.conf あたりに,ServerName 定義行を追記する.値は,デフォルトで使いたいサーバ名.
    通常は,最初に apache に読み込まれる VirtualHost 名.

    • 結果2:対処1をしなくても,エラーが両方消える.
      ServerName の設定が静的に記述されているので,この一連の動作自体が発生しないのだと思う.
  • 対処3:localhost に DNS サーバを立てる.
    • 対処1,2をしなくても,エラーが両方消える.

サーバーバックアップ

linux マシンが 2台あれば,rsync で良いのだけれど,ない場合には工夫がいる.
日常使いのPC→Win
サーバー→Linux
Winは使う時だけ起動
の前提の時,こんな風にしてみた.

linux マシン

crontab で zip を走らせる(etc var home を圧縮)

zip -P password -rq /tmp/etc.zip /etc

みたいな感じ。
mysql もバックアップ。

mysqldump | gzip > hoge.gz

Win マシン

C:> Winscp.com /script=scriptfilename
open username@hostaddr -privatekey=ppkfile.ppk
cd /remote_directory
lcd c:\local_directory
get etc.zip var.zip home.zip hoge.gz .\
exit

タスクスケジューラで,Winscp.com のコマンドを書いた bat ファイルを実行.

ドメインメールのサーバ移転

ドメイン管理に value-domain を使っており,メールのためだけにレンタルサーバーの契約を継続するのもバカバカしいので,今回移転することとした.
とはいっても,メールサーバーを自分で運用するのは面倒くさい.
そこで,value-domain でドメイン管理をしていると勝手についてくる xrea のフリースペースで運用を行なうことにした.
自分でベタに設定するのと,web UI で設定するのとではちょっと勝手が違うので,メモとして書いておく.

DNS レコード更新

value-domain の DNS レコードの更新ページで,「当サービス内サーバーの自動DNS設定」を使って基本のレコード設定を見る.
今回は,メールサーバーのみを使いたいので,1行目に入る
a * xxx.xxx.xxx.xxx
の行を,
a @ xxx.xxx.xxx.xxx
とした上で,メールサーバーの定義を
mx @ 10
とし、 必要なホスティングサーバーへのサブドメインを定義する.
未定義のサブドメインへのアクセスは,全部レンタルサーバーに流したいので,こうした.別に,a * のままでも良いのであれば,変更する必要はない.

ドメインメール設定

(DNS が反映されないと,次の工程は進まないので注意)
value domain のメニューの「サーバーアカウントの登録・管理・購入」から,設定したいドメインのメールの設定に飛ぶ.
このサービスでは,POP や web メールを使う場合,メールアドレス毎に異なるユーザーアカウントが割り当てされるので,面倒を避けるのであれば,マスターアドレスを1つ決めて,サブアドレスは全てマスターアドレスへ転送するのが良い.
マスターアドレスは「POP/WEB受信のみ」を選択しサーバー容量(フリーの場合は50MB)を選択する.
サブアドレスは「転送のみ」を選択した上で,マスターアドレスを転送アドレスとする.(私は,対外アドレスを変更する度に MUA の設定を変更したくないので,外に出すのはサブアドレスのみにしている)

MUA 設定

平文通信で良ければ,ドメインメール設定画面のパスワード欄の右に出る「確認」リンクから表示されるサーバーに対しPOPを飛ばす.
SSL 通信にしたければ,サーバーの FQDN のうち,ピリオドをハイフネーションに変換したアドレスの後ろに,「.value-domain.com」をつける.
ポートはいずれも標準のはず.

Word Press の設定

導入時の注意点

インストールは解凍するだけなので簡単.
mysql を展開しておわりかと思いきや,落とし穴があった.

  • mod_php を使う場合,フォルダ配下のオーナーを www-data とかにしておく.
  • 真っ新な wordpress を入れることにする場合,テーマとかプラグインとかが入ってなくて動かないので,バックアップの DB をインポートする前にとりあえず新規インストールを完了させてしまって,テーマとプラグインは入れておく.
  • プラグインやテーマのインストール時に FTP 接続情報を求められる場合,define('FS_METHOD','direct');を wp-config.php に入れる.
    多分,現象から推測するに,サーバーにプラグインを pull しにいくよう動作を変更させるのだと思われる...多分...

DB 構成について

  • wp_users,wp_usermeta はユーザー情報.とりわけ wp_users にはパスなんかも hash をかけて保存されている.
  • wp_terms,wp_term_* は,タグとかカテゴリとかリンクグループなどの名前・slug・分類・記事との関係を保存したもの.
  • wp_options は,プラグインとかの設定を保存したもの.消したプラグインの設定も残っているので,ゴミが多い.新規に入れ直して綺麗にしたい時にはバックアップ不要.
  • wp_posts は記事,wp_postmeta は記事内からのメディアファイルの参照や更新ロックの情報など.
    更新ロックの情報は削除しても問題なさげ.詳しくは,[WordPress] postmetaテーブルの_edit_lastと_edit_lock | きほんのき
    要は,meta_key="_edit_lock" に格納される UNIX タイムスタンプと,meta_key="_edit_last" に格納される最終更新ユーザーのユーザー ID は消しても構わんということ.
  • wp_comments はレス,wp_commentmeta はコメント削除などの情報.
  • 他は,そのまんまなので省略.

プラグインとか

  • WPTouch は, ver 1.9.5 以降は投稿できないバグがあるので,1.9.42 以前とすること. (1.9.4.2 の間違いではない.各人で readme.txt を読むこと)

また追記します…

BIND9 で DNS サーバ

昔,自鯖のwebサーバ化 という記事でちらっと書いたが,改めて再インストールしたマシンに書こうとすると,書けなかったので,調べ直した.

named.conf

named.conf から include しているファイルの設定も含む.

記述箇所 項目 tips とか
options version named が返す version 情報を変更する場合に指定.教えたくない場合に書く.
version 情報を調べ方は,

# dig @localhost chaos txt version.bind

localhost のトコは,調べたいサーバー名.

allow-update DNS の更新の許可をするか否か. 拒否したい場合は,
``allow-update {none;};``
zone zone ファイルを指定.
順引きの場合

zone	"domain.com"	{
	type	master;
	file	"path";	// options に記述した directory からの相対
};

逆引きの場合

zone	"x.y.z.in-addr.arpa"	{ // リトルエンディアン的表記
	type	master;
	file	"path";
};

zone ファイル (順引き)

記述箇所 項目 tips とか
$ORIGIN 記述対象のドメイン.
以降に,全く同じゾーン名を書く場合,@ と記述を略すことができる.
また,ホスト名を記述する時に,host と記述した場合,host.$ORIGIN を意味する.
$ORIGIN の末尾には . (ピリオド) を忘れないこと.
$TTL キャッシュの有効期限.このサーバーを参照する他のサーバーが,有効期限として活用する.
DNS が死んでも,この時間くらいは保持してもらえるかも知れない. (後述の をより長く指定していた場合)
SOA レコード (概略) そのゾーンの記述のトップに書くレコード.
例はこんな感じ.

@ IN SOA     (
	
	
	
	
	
	)
このゾーンのプライマリー DNS サーバ.A レコードで記述されたものを書くこと.
責任者のメールアドレス.アドレスの @ は . (ピリオド) で記述すること.@ より前に . (ピリオド) を使っている場合,\ (バックスラッシュ) でエスケープすること.
ゾーン記述のバージョンを示す通番.yyyymmddnn (nn は 01 からの通番) で書くのが一般的.前回更新より小さい数字だと,ちゃんと記述が伝播しない.間違えてデカすぎる数字を指定した場合は桁溢れさせてリセットするらしいが,その時に調べることにする.
このサーバーを参照するサーバーが,この数値毎に更新確認に来る. が増えていたら,更新をかける.
前回更新が失敗した時に,リトライするまでの周期. の約数を指定するらしい.約数を指定しなかった場合,落ち続けた時にプロセスが増えるのだろうか?試すのに時間かかりまくるので試さないで,言いつけに従うことにする.
更新が失敗し続けた時に,キャッシュを破棄するまでの期間.$TTL との値が違う時,どちらが優先されるかは不明.
ネガティブキャッシュ (aaa.domain.com が定義されてなかった時,「aaa.domain.com は未定義」という情報のキャッシュ) を保持する期間.
その他のレコード (概略) 記述は,

host	IN <レコード種別>	definition

という感じ.
NS:そのドメインのネームサーバーを記述.必ずしも, で指定したサーバーを記述する必要はない.
A:host -> IP addr の記述をする.
CNAME:別名の指定.
MX とかその他:とりあえず使う予定がないので,略.

zone ファイル (逆引き)

順引きで,AレコードがPTRになったと思えばOK.

チェック

named.conf の記述のチェックは,# named-checkconf [PATH] で行なう.
zone ファイルの記述チェックは,# named-checkzone domain PATH で行なう.
逆引きの場合,domain には x.y.z.in-addr.arpa を指定する.

resolv.conf への反映

resolv.conf の修正を忘れないこと.
ubuntu を新しいものにしたら,dhclient.conf の domain-name-servers とかをコメントアウトしても書き換えされてしまうようになった.
なので,/sbin/dhclient-script を書き換えることにした.
基本的には,resolv で出てくる行をコメントアウトするか,make_resolv_conf() を役立たずにすれば OK.
if 文の中に resolv の行しかないトコをコメントアウトする場合は,if 文ごとコメントアウトすること.
resolv.conf を普通のファイルにしたら,networking の restart でエラーを吐くようになったので,/etc/resolvconf/resolv.conf へのシンボリックリンクにした.元が何だったかは分からんが,まぁいいだろう.