SECCON CTF 全国大会に出場します。
私事ですが、本日および明日行われるハッキングコンテスト「SECCON CTF 2012年度全国大会」に、チームifconfigとして参加してきます。
Ураааааа!!!!
2つめのTracをホストしてみました
大学や仕事のこと、私的なことなどといったプライベートなあれこれもチケット管理しようといった考えから、公開用であるこのTrac
プロジェクトとは別に、認証もかけて自分専用のプロジェクトをホストしようと思いました。
同じホスト(同じサーバ)で2つのTrac
をホストした理由は、単にSSL証明書を節約するためです。
準備
例によって、任意のパスにTrac
用のディレクトリを作成し、Trac
化します。
詳細は以前の投稿を参照のほど。
[email protected] ~:$ mkdir another_project [email protected] ~:$ trac-admin another_project initenv [email protected] ~:$ chown -R trac:www-data another_project [email protected] ~:$ chmod -R 775 another_project
失敗例
nginxの設定で、location /private
を設定し、パスを変える方法は失敗でした。
なぜかというと、Trac
にprivate
というハンドラがないからです。
それから、uwsgiのSocketポートを変えただけでも、同様にだめでした。
そんなにたくさん試行錯誤はしていません。エンジニアたるものもっと失敗にぶち当たるべき。
成功例
結局、私的に使うやつなのでポート番号くらい非defaultでもいいだろということで、別のポートでlistenすることにしました。
- /etc/nginx/sites-available/trac_private
-
server { listen 55555 ssl; server_name x86-64.jp; ssl_certificate /path/to/your/ssl/cert.pem; ssl_certificate_key /path/to/your/ssl/key.key; root /home/trac/another_project; location /favicon.ico { } location /robots.txt { } if ($scheme = http) { return 301 https://$server_name$request_uri; } location / { include uwsgi_params; uwsgi_param REMOTE_USER $remote_user; uwsgi_param HTTPS on; # リクエストが勝手にHTTPになる現象をこの行で解決 include uwsgi_params; uwsgi_pass 127.0.0.1:7778; auth_basic "Trac"; auth_basic_user_file "/path/to/your/.htpasswd"; } }
uwsgi_pass
のSocketポート番号は、ほかに走っているuwsgi
アプリケーションと違うのに気をつけてください。同じだと破滅が起こります。
このconfをsites-enabled
にシンボリックリンク張って、uwsgi
とnginx
を再起動して完了。
Tracの設定を見なおしたりしてみました
自分のアカウントでhttp-basic認証でログインしていても、どうもAdmin
メニューからTracの一般設定ができないと思っていました。
結局何が問題だったかというと、自分のアカウントにTRAC_ADMINが設定されていなかっただけでした。凡ミス。
次のコマンドにて解決。
[email protected] ~:$ trac-admin ~/your_trac_project permission add foo TRAC_ADMIN
先日のブログエントリに記載したコマンドを、自分で実行するのを忘れていたとは。
さらに検証してみると、TRAC_ADMIN
でなかったのにAdmin
メニューが選択できたのは、自分がBLOG_ADMIN
だったからでした。
あれ?と思ったら、まずは設定から見なおしてみると十中八九なんか見つかります。
それはそうと、SharingButtonsPluginを導入してみました。
Wiki
にはボタンが設置されたことを確認しましたが、Blog
はどうやら外部プラグインを使っているため非対応なのか、表示されません。
暇があったら、様々なプラグインにも対応できるようにこれを改造してみてもいいかもしれませんね。
nginxとuwsgiを使ってTracをホストしよう
このTrac
をセットアップするのに多くの時間を費やし、文献を読みあさったのでここに手順やハマりどころをまとめておきます。
そこらの文献というのはなぜかコマンドをどの権限やパスで実行するか明記していないケースがあるので、この記事ではコマンドの説明をするときはbash
っぽくプロンプトの部分から記述します。
- なんかサーバを用意します(当サーバはAmazon EC2上のUbuntu 12.04.2)
以降、ホスト名はreimu
と表します(このホストがreimu.x86-64.jpだから)
- 必要なものをパッケージマネージャなり公式サイトなりから引っ張ってきます。
わたしはaptを使って手を抜きました。依存環境などもまるまる降ってくるし、アップデートの適用もシステムと一緒にできるという恩恵にあずかれます。
[email protected] ~:# apt-get install nginx uwsgi uwsgi-plugin-python trac trac-git
trac-git
はTrac
でgit
使いたいから入れておいたもので、必須ではありません。
で、uwsgi
って結局なんなん: Uwsgi?
- わたしはWebサイトごとにユーザを作るスタイルを採用しているので、
Trac
用にユーザを作っちゃいます。[email protected] ~:# adduser -G www-data trac
nginx
が走るグループは、環境によってはwww-data
ではないかもしれません(httpd
とか)
ユーザ分けとかどうでもいい場合はwww-data
さんが参照できるディレクトリを用意するだけで大丈夫です。
Trac
のプロジェクトが入るディレクトリを適当に作り、Trac
に付属しているTrac-admin?コマンドでそのディレクトリをTrac
化します。
これは通常ユーザ(この記事の例ではtrac
,Trac
用のユーザを作らなかった場合はwww-data
)で行います。[email protected] ~:$ mkdir your_trac_project [email protected] ~:$ trac-admin ~/your_trac_project initenv
initenv
を行っているときに、プロジェクトの名称とデータベースファイルのパスを決められます。
これがTrac
のタイトルとして反映されます。たとえばこのTrac
なら真剣な悪ふざけになっています。 どうやらUTF-8なら2バイト文字でもいいみたいです。
- このへんで
Trac
の管理者アカウントを登録しておきましょう。[email protected] ~:$ trac-admin ~/your_trac_project permission add foo TRAC_ADMIN
これで、ユーザfoo
が管理者になりましたので、foo
としてhttp-auth-basic
(以下Basic認証と記述)でログインできるように設定します(後述)。
Trac
についての、uwsgi
用とnginx
用のconfigを作ります。
わたしはこうしました:
- /etc/uwsgi/apps-available/trac.xml
-
<uwsgi> <socket>127.0.0.1:7777</socket> <plugin>python</plugin> <!--この行が意外と重要--> <env>TRAC_ENV=/home/trac/project-directory</env> <module>trac.web.main:dispatch_request</module> </uwsgi>
- /etc/nginx/sites-available/trac
-
server { listen 80; listen 443 ssl; server_name x86-64.jp; ssl_certificate /path/to/ssl-cert.pem; ssl_certificate_key /path/to/ssl-key.key; root /home/trac/your_trac_project; location /favicon.ico { } location /robots.txt { } if ($scheme = http) { return 301 https://$server_name$request_uri; } location / { include uwsgi_params; uwsgi_pass 127.0.0.1:7777; } location /login { include uwsgi_params; uwsgi_param REMOTE_USER $remote_user; uwsgi_pass 127.0.0.1:7777; auth_basic "Trac"; auth_basic_user_file "/path/to/your/.htpasswd"; } }
uwsgi
用のconfで書いたソケットはportが7777なので、こちらのconfでもuwsgi_pass
を7777に設定しておきます。
このようにして、nginx
にアクセスがあったとき、uwsgi
を通してTrac
のコンテンツを引っ張りにいく設定にします。 ちなみにこのTrac
はSSL-enabledなので、ところどころSSLに関する設定が入っています。
htpasswd
を使って、Basic認証に使うアカウントを生成します。
Apacheを入れていないUbuntuではそんなコマンドないかもしれないですが、apache-utils
をインストールすればOKです(記事は省略)[email protected] ~:$ htpasswd -c /path/to/your/.htpasswd foo [email protected] ~:$ chgrp www-data /path/to/your/.htpasswd [email protected] ~:$ chmod 750 /path/to/your/.htpasswd
これによってユーザfoo
が含まれる.htpasswd
が生成されたので、このユーザでログインすることでTrac
のWebインタフェースからの管理ができるようになりました。
個人的にはここでroot
以外が.htpasswd
を読めるのがきもい。まあしょうがない。
- 上で書いたconfigをenableします。
[email protected] ~:# ln -s /etc/nginx/sites-available/trac /etc/nginx/sites-enabled/trac [email protected] ~:# ln -s /etc/uwsgi/apps-available/trac.xml /etc/uwsgi/apps-enabled/trac.xml
uwsgi
とnginx
をrestart
して完成。[email protected] ~:# service uwsgi restart [email protected] ~:# service nginx restart
ああそういえば:
エラーが発生したときは、結構な確率でパーミッションがおかしいです。
とくにTrac
を運用するにあたってwww-data
が読み書きできなくてはいけないファイルは、
your_trac_project/conf/trac.ini
your_trac_project/db/trac.db
が大事です。これらのファイルについて
www-data
がrとwの権限を持っているかチェックしましょう。
それからハマりどころとして、
uwsgi
の設定にてPythonのプラグインを使うことを明記しないとちゃんと動かなかったのでメモ。
ざっとこんなところかしら。なんか抜けがある気がするので暇な時に検証します。
参考文献
README
Author | くりす |
---|---|
Subject | Linuxサーバ |
セキュリティ | |
ネットワーク | |
WIDE Project | |
数学 | |
その他勉強, 研究したこと | |
Purpose | メモ, リファレンス |
コメントはdisableしていますので、ご意見がありましたらTwitterにて@x86_64までお願いします。