Ubuntu カスタマイズ

apt-get upgrade で出てきたパッケージ(apport)が聞いたことのないものだったので,調べたついで.
Ubuntu Server では関係ないかも知れんけど.
Ubuntu 12.04 LTS の便利なカスタマイズ方法 » Libre Free Gratis! | Libre Free Gratis!

それにしても,1分くらいで再起動してくれた我が家の Ubuntu Server 12.04 LTS … 早い.

2013/1/27 追記するよー.

apt on ubuntu

sources.list 作りはこちら → Ubuntu Sources List Generator

apt-get update のエラーについて.

W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used.
GPG error: http://extras.ubuntu.com precise Releas: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 16126D3A3E5C1192
W: Failed to fetch http://extras.ubuntu.com/ubuntu/dists/precise/Release

なんか,上みたいな GPG 鍵でエラーが出たら,これ.

# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 16126D3A3E5C1192

そうしたら,普通に apt-get update が通る.

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 ファイルを実行.

SD カード上に入れた gnupack で python numpy を使う

SD カード上の gnupack (gnupack_devel-10.00) で、python numpy を apt-cyg から入れても動かない。

>>> import numpy
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/site-packages/numpy/__init__.py", line 137, in <module>
    import add_newdocs
  File "/usr/lib/python2.6/site-packages/numpy/add_newdocs.py", line 9, in <module>
    from lib import add_newdoc
  File "/usr/lib/python2.6/site-packages/numpy/lib/__init__.py", line 13, in <module>
    from polynomial import *
  File "/usr/lib/python2.6/site-packages/numpy/lib/polynomial.py", line 17, in <module>
    from numpy.linalg import eigvals, lstsq
  File "/usr/lib/python2.6/site-packages/numpy/linalg/__init__.py", line 48, in <module>
    from linalg import *
  File "/usr/lib/python2.6/site-packages/numpy/linalg/linalg.py", line 23, in <module>
    from numpy.linalg import lapack_lite
ImportError: No such file or directory
>>>

web を検索すると、こういう情報が出てくる。→
numpyでlapack_fileを読み込んでくれないとき – 放置演算子
このサイトで言っているのは、必要なライブラリにパスが通ってないということだが、このサイトの対応方法では新しいバージョンを上書きインストールした時に、使っているライブラリとズレが出て、将来にハマる可能性がありそう。
なので、リンクを張ることにするが、やっぱ怒られる。

>>> import numpy
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/site-packages/numpy/__init__.py", line 137, in <module>
    import add_newdocs
  File "/usr/lib/python2.6/site-packages/numpy/add_newdocs.py", line 9, in <module>
    from lib import add_newdoc
  File "/usr/lib/python2.6/site-packages/numpy/lib/__init__.py", line 13, in <module>
    from polynomial import *
  File "/usr/lib/python2.6/site-packages/numpy/lib/polynomial.py", line 17, in <module>
    from numpy.linalg import eigvals, lstsq
  File "/usr/lib/python2.6/site-packages/numpy/linalg/__init__.py", line 48, in <module>
    from linalg import *
  File "/usr/lib/python2.6/site-packages/numpy/linalg/linalg.py", line 23, in <module>
    from numpy.linalg import lapack_lite
ImportError: Exec format error
>>>

しょうがないので、調べてみる。

# cygcheck.exe /lib/python2.6/site-packages/numpy/linalg/lapack_lite.dll
G:\gnupack_devel-10.00\app\cygwin\cygwin\lib\python2.6\site-packages\numpy\linalg\lapack_lite.dll
  G:\gnupack_devel-10.00\app\cygwin\cygwin\bin\cygwin1.dll
    C:\WINDOWS\system32\KERNEL32.dll
      C:\WINDOWS\system32\ntdll.dll
  G:\gnupack_devel-10.00\app\cygwin\cygwin\bin\cyglapack-0.dll  G:\gnupack_devel-10.00\app\cygwin\cygwin\bin\libpython2.6.dll
chgcheck: G:\gnupack_devel-10.00\app\cygwin\cygwin\bin\cyglapack-0.dll is a symlink instead of a DLL

シンボリックリンクはダメ、らしい。
じゃぁ、とハードリンクを張ろうとするが、Fat32 でフォーマットされている SD カード上ではハードリンクが張れない。
ということで、SD カードを NTFS でフォーマットし直す。→SDカードをNTFSフォーマットする
で、その SD カード上でハードリンクを張れば、ちゃんと動く。

# cd /usr/bin
# ln /usr/lib/lapack/cygblas-0.dll cygblas-0.dll
# ln /usr/lib/lapack/cyglapack-0.dll cyglapack-0.dll

kobo glo 買ったよ

蓋,開けたよ.
参考は,こちら.

で,外から telnet が通るようにしてみた.
参考はこちらだが,注意があるkoboが来た - kobo
このサイトでは kobo (多分,touch) が使われていて,kobo glo とは少し仕様が違う.
microSD はただ引っこ抜くだけだし,4GB だし,DD for Win からは認識しないし.
なので,Linux から mount していじること.

リンク先のコピーだけど,まぁやったこと.

  • Ubuntu on VBox から microSD をマウント.
    • VBox のインストールは省略.
    • デバイスから,USB デバイスのmicroSDを選択.
    • どうせ最初は dd で吸い出すだけなので,念のため umount しておく.
  • コピー
    # dd if=/dev/sdb of=backup

    デバイス名は df とかで確認すること.3つパーティションがあるけど,焦らない.

  • /rootfs/etc/init.d/rcS へ,ターミナルが使う pts デバイスをマウントさせる.
    hostname kobo
    mkdir -p /dev/pts
    mount -t devpts devpts /dev/pts
    

    1行目の hostname がなかったら,どうなるかは調べてない.

  • /rootfs/etc/services でコメントアウトされているポートとサービスの対応を認識させる.
  • /rootfs/etc/inetd.conf で ftpd と telnetd のコマンドを書く.
    ftp stream tcp nowait root /bin/busybox ftpd -w -S  /
    telnet stream tcp nowait root /bin/busybox    telnetd -i

    busybox へのリンクを /rootfs/bin 辺りに作っておけばいいじゃないか,という気がせんでもないが...
    各オプションの意味は,-w: アップロード許可,-S: /var/log/ftpd へ出力,-i: inetd 経由で起動,らしい.

  • /rootfs/etc/inittab で inet の起動コマンドを記述.
    ::respawn:/usr/sbin/inetd -f /etc/inetd.conf
    参照先のコマンドには typo があるので注意.

追記:
結局,swap 領域を作りたくて,KoboFW2.2.1Patch を拾ってきて入れちゃった.

追記2:
4GB のオリジナルイメージを 32GB の SanDisk Ultra Speed に DD でつっこもうとしたら,1時間たっても終わらんとか,鬼過ぎるほど時間かかる.
メインストレージの差し替えを考えてる人,マジ注意だぜ.

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 へのシンボリックリンクにした.元が何だったかは分からんが,まぁいいだろう.

WebDAV + SSL + SNI + SVN

WebDAV+SSL+SNIを進行中。
SSL+SNIの設定は、通常通り。
WebDAVは、

a2enmod dav
a2enmod dav_fs

とした上で、site-enabled にある記述に、SSLを行なうSNIの設定を記載。
dav_fs.conf で設定している事例を良く見るが、SNI で動かすためには VirtualHost ディレクティブで記載しないといけないので、site-enabled からリンクしているサイト設定に記載した。
なので dav_fs.conf はこんな感じで小さい。

DAVLockDB ${APACHE_LOCK_DIR}/DAVLock
DAVMinTimeout 600

で、サイト設定はこんな感じ。


        ServerName host.domain
        ServerAdmin user@domain
        DocumentRoot /webdav
        SSLEngine on
        # 他、SSLの設定とか

        
                DAV On
                Options Indexes
                SSLRequireSSL
                # 他にdigest認証とかここに書いてもいいし、.htaccessを置いてもいい
        

現在、WebDAVクライアントで動作確認済。Windowsファイルシステムから直接アクセスするのは諦めた。

今後の計画

  • DAV+SVN で、SVN over SSL を通す
  • WPのspam投稿の分析プラグインの作成
  • 最初は、WPのダッシュボードから、手動でのアク禁適用
    • 投稿をフックしてスパムフラグのあるものは別DBにも格納
    • DBには、IPを8bitずつのアドレスに分割して、格納?
    • ネットマスクの短さとspamアクセスの多さの閾値から、自動的にアクセス拒否をさせる
    • 拒否後も403のアウトプットでphpを呼び出して、投稿されたのと同じ扱いでアクセス数をカウント
    • アクセス数の増により、長いネットマスクでアク禁した複数のアドレスを統合するなど

mod_php が作ったファイルとか /etc などのバックアップ

DMZ 上のサーバーのシステムファイルを、LAN 上のマシンへバックアップしたいが、一部の一般ユーザーにアクセス権を付与していないファイルをどうバックアップするか、という話。

状況:

  • サーバーへ、root ログインなどさせたくない
  • クライアント側からユーザー権限でアクセスして rsync を走らせるのでは sync できない。
  • DMZ のサーバーなので、サーバーからLAN へのアクセスをさせたくないため、sudo つきのコマンドを cron で回すわけにも行かない

やったこと:

  • apache2 の実行ユーザーのグループへバックアップユーザーを追加し、php で作成されるファイルにはグループ向けの読み込み属性をつけておく。
  • root の cron で、システム設定ファイル等のバックアップをバックアップユーザー権限のファイルに固めて、バックアップユーザーの読めるディレクトリへ移す。
  • バックアップユーザーで rsync を走らせる

なんか綺麗じゃないな…
でも睡眠時間を削るほどのことでもないので気にしないことにしよう。
意外と、DMZ 面倒くさい。