Hatena::ブログ(Diary)

仮メモ

2018-06-28

[] Subversion 1.10で認可され(authorize)ない

1.9から1.10にサーバをバージョンアップしたら問題が発生した。

svn up なり svn list なりを行うと、

svn: E175013: Access to '/path/to/hoge/trunk' forbidden

と出てアクセスできない。HTTP(S)経由なので、LogLevel debug としてログを追ってみると最後に

Access denied: 'admin' OPTIONS hoge:/trunk

となっていて、認証(authentication)まではうまくいっている。

認可用ファイルは以下の通り

[/]
admin = rw

[hoge:/]
user = rw

こうしておくと、今までは admin ユーザは全リポジトリにアクセスできていた。

どうも1.10から一番詳しく一致するレコードのみ見るようになった風に思える。確かにその方がより細かくアクセス制御はできるのだろうが、リリースノートには認可周りの修正と強化をしたとあるだけで、そのような非互換の変更があったとは書いていない(か、気付かなかった)。

対策1 新機能の :glob:を使う

[/][:glob:/*] としたらアクセスできるようになった。

より深いパスの指定が他にある場合は、それより優先させるために [:glob:/**] とする必要があるはず。

一番単純で admin としての意図に近いのでこの方法にした。大量にファイルを舐める時にパフォーマンス的には悪いかもしれない。

対策2 各レコードにいちいち権限を付ける

[hoge:/] 以下にも admin = rw を加えても、アクセスできるようになった。

これはリポジトリが多い場合、記述が冗長になりすぎる。

対策2.1 グループを使う

ユーザをすべてグループ定義に変えて、各グループに admin を加えれば、それなりにコンパクトになる

[groups]
user = user, admin

[hoge:/]
@user = rw

ただ、グループ名にユーザ名を使うにしろリポジトリ名を使うにしろ、本来のグループの使い方とずれているので、後で混乱しそうだ。

2018-04-24

[]CentOS 7でgeoipupdateが動かなくなった

GeoIP-update-1.5.0-11.el7 が4月からエラーを吐くようになった。

/etc/cron.weekly/geoipupdate:
Received Error -21 (Sanity check database_info string failed) when attempting to update GeoIP Database
Received Error -21 (Sanity check database_info string failed) when attempting to update GeoIP Database

サイトを確認してみると、ライセンス購入をしていないとLegacy Databaseは更新できなくなり、ダウンロードできるのも3月版のみ、しかも2019年1月2日からはウェブからも削除されるらしい。

GeoLite2は使える風なので、別途GeoIP2をインストールしてみる。

インストール

まずGeoLite2 Databaseをダウンロードする。

ファイルが散らからないように /opt/geoip 以下に入れることにした。

mkdir -p /opt/geoip/share/GeoIP
cd !$
curl -O http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz
curl -O http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.tar.gz
#curl -O http://geolite.maxmind.com/download/geoip/database/GeoLite2-ASN.tar.gz
for f in *.gz; do tar xaf $f; done
mv -i Geo*/*.mmdb ./
rm -f Geo*.gz Geo*/*.txt
rmdir -f Geo*/

更新のためgeoipupdateを入れる。

sudo yum install libcurl-devel
git clone --depth=1 https://github.com/maxmind/geoipupdate
cd geoipupdate
./bootstrap
./configure --prefix=/opt/geoip
make
sudo make install

デフォルトでは更新時のTLS接続の証明書を確認しないようなので修正する。

思い切り逆のことをしていた。この手順は必要ない。

cat <<'END' >> /opt/geoip/etc/GeoIP.conf
SkipHostnameVerification 1
SkipPeerVerification 1
END

ASN databaseも更新するならばGeoIP.confのEditionIDsにGeoLite2-ASNを追加する必要がある。

更新をテストする

/opt/geoip/bin/geoipupdate -v | less

ASN databaseは毎週火曜、他は毎月最初の火曜に更新されるらしい。

タイムゾーンが不明なので木曜頃に更新するようにcrontabに書いた。

23 9 1-8 * Thu /opt/geoip/bin/geoipupdate

以上だが…

あとは各アプリケーションでGeoIPではなくGeoIP2を使うようにする必要があり、これが多いと面倒かもしれない。

またDBパスがデフォルトではないので /opt/geoip/share/GeoIP 以下を指定する必要がある。

2018-01-21

[][]cURL 7.56.0で大きなデータをPOSTするとデータが壊れる

curl_setopt()CURLOPT_POSTFIELDSでデータを設定し送信するときに、16KBあたり以降のデータが先頭からの繰り返しになる。

PHP 7.1.11以降、最新のPHP 7.2.1でも起きる。

cURLのバグのようで、公式WindowsビルドのcURLがPHP 7.1.11から7.56.0にアップデートしたためのようだ。

cURL 7.56.1で修正されているのだが、Windows版PHPのリンクしているcURLが古いままなのでなんともしがたい。