nginx

nginxはNginx, Inc.によって開発されているWebサーバー。
イベント駆動アプローチを採用しており、静的ファイル配信を得意とする。
多くのリクエストを簡単に捌けることから、リバースプロキシ用途やVPSなどで人気がある。
2条項BSDライセンスで公開されている。

こういった利点に対し、以下のような欠点もある。

  • .htaccessを利用できない
  • CGIを利用できない(FastCGI, SCGI, uWSGIなどで代替する必要がある)

PukiWiki を動かすときの注意

PukiWikiのパッケージには、設置した階層以下の全てで.htaccessの利用が許可されている場合のWebアクセス制御サンプルしか収録されていない。
このためnginxで運用するには、nginx.confなどで自らアクセス制御の設定を行い、部外秘のファイルを非公開にする必要がある。

Example

server {
	listen 80;
	listen [::]:80;

	server_name wiki.example.org;

	root /var/www/wiki.example.org/;
	index index.php;

	location / {
		try_files $uri $uri/ =404;
	}

	# deny .htaccess, .htpasswd, .gitignore and .git/
	location ^~ /. { deny all; }

	# deny directories
	location ~ ^/(attach|backup|cache|counter|diff|lib|plugin|wiki|wiki.en)/ { deny all; }

	# deny files
	location ~ \.(htaccess|ini\.php|lng\.php|skin\.php|txt|gz|tgz|zip)$ { deny all; }

	location ~ \.php$ {
		# ↓スペースを取り除くこと
		fastcgi_pass unix:/ run/php/php7.0-fpm.sock;
		fastcgi_split_path_info ^(.+?\.php)(/.*)$;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include fastcgi_params;
	}
}

危険性

pukiwiki.ini.phpにはadminパスワードが記載されている*1ため、絶対に漏らしてはいけない。
nginxでPukiwikiを動かす場合、pukiwiki.ini.phpがダウンロードできないことを必ず確認してください

"403 Forbidden"が返ってくるか、真っ白なページが表示される*3場合は問題ありません。

コメント

  • Qiita に書こうかなと思いましたがとりあえずこちらに公開しました。
    「偉そうなこと言ってるけどお前の nginx.conf も間違ってるよ!」などあれば指摘してください。 -- bee? 2016-11-20 (日) 02:37:49
  • "危険性"節を修正。.php なので deny しなくてもスクリプトとして実行されますね…。 -- bee? 2016-11-20 (日) 05:30:47
  • nginxいいですね。PukiWikiでPHPとしての実行が必要なのは /index.php ( と /skin/pukiwiki.css.php ) だけなのでホワイトリスト方式にしてもよさそうです。以下、デフォルトの応答を404 Not Foundにしておいて「/ と /skin/*.php だけ実行可能」「/image/, /skin/ のみ HTTPアクセス可能」にする設定です。あまり一般的ではないかも -- umorigu 2016-11-22 (火) 00:50:15
    server {
      listen 80;
      server_name wiki.example.org;
    
      root /var/www/wiki.example.org;
      location ~ (^/$)|(^/skin/.+\.php$) {
        # With php5-fpm:
        fastcgi_pass unix: /var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      }
      location ~ ^/(skin|image)/ {
      }
      location / {
        return 404;
      }
    }
    • 本当は skin/ 以下を静的なファイルだけにできると良いのですがデフォルトの構造はそうなっていません。(カスタマイズはもちろん可能です)
  • 分かりやすくするために順番を変えてみました。「/ と /skin/*.phpはPHPとして実行」「/image, /skinはファイルをそのまま返す」「それ以外は404 Not Found」の設定です -- umorigu 2016-11-23 (水) 00:33:51
  • (unix: /... の文字列もURLとして弾かれてしまうんですね...) -- umorigu 2016-11-23 (水) 00:38:28
  • ホワイトリスト方式のほうが綺麗ですねー。流石です。 -- bee? 2016-11-24 (木) 03:50:17
  • ホワイトリスト方式を試させてもらったのですが、最初のlocationは以下としないとindex.phpにアクセスしたときに動作しないのではないでしょうか。-- pojiro? 2017-08-15 (火) 22:30:17
    location ~ (^/$)|(^/index\.php$)|(^/skin/.+\.php$)
  • はい。その通りです。むしろ、/index.php でアクセスさせないための設定です -- umorigu 2017-08-16 (水) 21:10:12


*1 平文パスワードではなくハッシュ化されている。しかし、総当たり攻撃に対して脆弱*2
*2 ストレッチングされていないため。またmd5/sha1を選択した場合はソルトさえ付与されていないため。
*3 スクリプトとして実行されてしまっているが、何もechoしないため問題にならない。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-08-16 (水) 21:10:12
Site admin: PukiWiki Development Team

PukiWiki 1.5.1+ © 2001-2016 PukiWiki Development Team. Powered by PHP 5.6.30-0+deb8u1. HTML convert time: 0.466 sec.

OSDN