私はUbuntu 10.04上でApache + mod_wsgiとPostgreSQLを使ってDjangoサイトをデプロイすることを計画しています。
IDENT認証を使用してデータベースに接続します。これには、Apache用のPostgresqlユーザーを作成する必要があります(www-data
)私はこれをスーパーユーザーにしたり、特別な特権を与えたりしないことを選択しました。
データベースを作成しました。 私は実際にテスト中にこれを2回行いました。初めてApacheユーザーを所有者に設定しました。 2回目は所有者を自分(スーパーユーザー)に設定し、データベースに対するすべての権限をApacheユーザーに付与しました。
Djangoのsyncdb管理コマンドを使用したとき(私もそうですが)、作成されたテーブルにはApacheユーザーはアクセスできません。これは各テーブルのApacheユーザにすべてのパーミッションを与えることで解決できますが、それは少し面倒です。
代替案はスーパーユーザーとしてアクセスを許可することのようです。
私のプロジェクトがPostgreSQLスーパーユーザーとしてローカルのdbにアクセスすることは安全で許容できると考えられますか、そしてIDENT認証を使用することは安全ですか?そうでない場合は、一般的な方法は何ですか?
編集: 私は以来、PostgreSQLをローカル接続にmd5認証を使用するように切り替えることで作業が楽になることを発見しました。
ident認証を使用している場合、データベースへの接続は通常の操作中はApacheユーザーを介して行われます。 Djangoの管理コマンドを使用すると、接続は現在のユーザー経由で行われます。
MD5を使用している場合、どちらの状況でもsettings.pyファイルのDATABASESセクションに指定された詳細を使用してデータベースに接続し、上記の問題を回避します。
PostgreSQLスーパーユーザを使用するのが賢明かどうかを知りたいのです。
回答:
回答№1の場合は3アプリケーションをスーパーユーザーとして接続するほぼ間違いなく賢明ではありません。アプリケーションがデータベース自体を実際に作成および/または削除する必要がない限り(そしてこれは非常にありそうもないですが)、私はそれが必要であるとは考えていません。アプリケーションがそのデータベースの所有者としてデータベースに接続する場合、それは事実上そのデータベースの範囲内のスーパーユーザーです。 あまりにも 悪い。
私は一般的にアプリケーションがデータベースにアクセスするMD5で認証されたアカウントを使用します。たとえば、アプリケーションアカウントがMD5認証を使用できる唯一のアカウントで、ローカルマシン上の他のすべてのユーザーがident / peer認証を使用するようにpg_hba.confを設定することは可能です。
ここであなたが実際に必要としていたのは、Apacheユーザーと他のDjangoユーザーをグループにまとめる役割だったように思えます。
Postgresqlには、スキーマ内のすべてのテーブルなどに対する権限を一度に付与する方法と、新しいオブジェクトに適用するデフォルトの権限を指定する方法があります。この前の答えは役に立つかもしれません: PostgreSQLで読み取り専用のユーザをどのように作成しますか?
回答№2については4
IDENT認証は、価値があるよりも面倒なことになりました。これが、PostgreSQLスーパーユーザロールの使用を避けるために行ったことです。
に切り替える postgres
Linuxユーザー:
sudo su - postgres
PostgreSQLのホストベース認証設定ファイルを編集します。
nano /etc/postgresql/8.4/main/pg_hba.conf
このファイルの末尾近くまでスクロールし、次のような行を探します。
local all all ident
変化する ident
に md5
終了して保存します。これはPostgreSQLにローカル接続の認証にMD5暗号化パスワードを使用するように伝えます。今PostgreSQLを再起動します。
/etc/init.d/postgresql-8.4 restart
PostgreSQLユーザーを作成します。
createuser django_user --pwprompt
プロンプトが表示されたら、特別な権限を受け入れないでください。新しいデータベースを作成します。
createdb -E UTF8 -O django_user django_db
これらのオプションはデータベースをUTF8でエンコードし、所有者をdjango_userに設定します。元のLinuxユーザーアカウントに戻ることができます。
exit
あなたのプロジェクト設定ファイル(settings.py)にはこのようなものを含める必要があります。
DATABASES = {
"default": {
"ENGINE": "django.contrib.gis.db.backends.postgis",
"NAME": "django_db",
"USER": "django_user",
"PASSWORD": "[your password]",
"HOST": "",
"PORT": "",
}
}
あなたが走るとき python manage.py syncdb
あるいは他のDjango管理コマンドでは、上記の設定がデータベースとの認証に使用されます。