セキュリティ—Pythonドキュメント
安全
序章
Celeryはセキュリティを念頭に置いて作成されていますが、安全でないコンポーネントとして扱う必要があります。
セキュリティポリシーに応じて、Celeryのインストールをより安全にするために実行できるさまざまな手順があります。
気になる部分
ブローカ
ブローカーは、特に一般の人々がアクセスできる場合は、不要なアクセスから保護することが不可欠です。 デフォルトでは、ワーカーはブローカーから取得したデータが改ざんされていないことを信頼しています。 ブローカー接続の信頼性を高める方法については、メッセージ署名を参照してください。
防御の第一線は、ブローカーの前にファイアウォールを配置し、ホワイトリストに登録されたマシンのみがファイアウォールにアクセスできるようにすることです。
ファイアウォールの設定ミスとファイアウォールの一時的な無効化の両方が現実の世界では一般的であることに注意してください。 堅固なセキュリティポリシーには、ファイアウォール機器が誤ってまたは故意に無効にされているかどうかを検出するための監視が含まれます。
言い換えれば、ファイアウォールを盲目的に信頼するべきではありません。
ブローカーがRabbitMQのようなきめ細かいアクセス制御をサポートしている場合、これを有効にすることを検討する必要があります。 たとえば、 http://www.rabbitmq.com/access-control.htmlを参照してください。
ブローカーバックエンドでサポートされている場合は、:setting: `broker_use_ssl` を使用してエンドツーエンドのSSL暗号化と認証を有効にできます。
クライアント
Celeryでは、「クライアント」とは、タスクを適用するWebサーバーなど、ブローカーにメッセージを送信するすべてのものを指します。
ブローカーを適切に保護することは、クライアントを介して任意のメッセージを送信できるかどうかは関係ありません。
[ここにもっとテキストが必要]
ワーカー
ワーカー内で実行されるタスクのデフォルトの権限は、ワーカー自体の権限と同じです。 これは、次のようなリソースに適用されます。 メモリ、ファイルシステム、およびデバイス。
このルールの例外は、現在デフォルトであるマルチプロセッシングベースのタスクプールを使用する場合です。 この場合、タスクは、fork()
呼び出しの結果としてコピーされたすべてのメモリにアクセスし、同じワーカーの子プロセスで親タスクによって書き込まれたメモリの内容にアクセスできます。
メモリコンテンツへのアクセスを制限するには、サブプロセス(fork()
+ execve()
)内のすべてのタスクを起動します。
ファイルシステムとデバイスへのアクセスを制限するには、 chroot 、 jail 、 sandboxing 、仮想マシン、またはプラットフォームや追加のソフトウェアで有効になっているその他のメカニズムを使用します。 。
ワーカーで実行されるタスクはすべて、それが実行されているマシンと同じネットワークアクセスを持つことに注意してください。 ワーカーが内部ネットワーク上にある場合は、アウトバウンドトラフィックにファイアウォールルールを追加することをお勧めします。
シリアライザー
デフォルトのシリアライザーはバージョン4.0以降のJSONですが、制限されたタイプのセットしかサポートしていないため、代わりにピクルスを使用してシリアル化することを検討してください。
pickle シリアライザーは、ほとんどすべてのPythonオブジェクトをシリアル化できるので便利ですが、同じ理由で[X147X] pickle は本質的に安全ではありません * 、クライアントが信頼されていない、または認証されていない場合は常に回避する必要があります。
:setting: `accept_content` 設定で受け入れられたコンテンツタイプのホワイトリストを指定することにより、信頼できないコンテンツを無効にできます。
バージョン3.0.18の新機能。
ノート
この設定は、バージョン3.0.18で最初にサポートされました。 以前のバージョンを実行している場合は単に無視されるため、それをサポートするバージョンを実行していることを確認してください。
accept_content = ['json']
これは、シリアライザー名とコンテンツタイプのリストを受け入れるため、jsonのコンテンツタイプを指定することもできます。
accept_content = ['application/json']
Celeryには、Celeryクライアントとワーカー間の通信を検証する特別な auth シリアライザーも付属しており、メッセージが信頼できるソースから発信されていることを確認します。 公開鍵暗号化を使用すると、 auth シリアライザーは送信者の信頼性を検証し、この読み取りメッセージ署名を有効にして詳細を確認できます。
メッセージ署名
Celeryは、:pypi: `cryptography` ライブラリを使用して、公開鍵暗号化を使用してメッセージに署名できます。クライアントから送信されたメッセージは、秘密鍵を使用して署名され、後でワーカーによって検証されます。公開証明書を使用します。
最適な証明書は、公式の認証局によって署名される必要がありますが、自己署名することもできます。
これを有効にするには、:setting: `task_serializer` 設定を auth シリアライザーを使用するように構成する必要があります。 署名されたメッセージのみを受け入れるようにワーカーを強制するには、 accept_content を ['auth'] に設定する必要があります。 イベントプロトコルの追加の署名については、 event_serializer を auth に設定してください。 また、ファイルシステム上で秘密鍵と証明書を見つけるために使用されるパスを構成する必要があります::setting: `security_key` 、:setting:` security_certificate` 、および :setting: `security_cert_store` 設定それぞれ。 :setting: `security_digest` を使用して署名アルゴリズムを微調整できます。
これらを設定したら、celery.setup_security()
関数を呼び出す必要もあります。 これにより、安全でないすべてのシリアライザーも無効になり、ワーカーが信頼できないコンテンツタイプのメッセージを受け入れないようになることに注意してください。
これは、 auth シリアライザーを使用した構成例であり、秘密鍵と証明書ファイルは / etc / ssl にあります。
app = Celery()
app.conf.update(
security_key='/etc/ssl/private/worker.key'
security_certificate='/etc/ssl/certs/worker.pem'
security_cert_store='/etc/ssl/certs/*.pem',
security_digest='sha256',
task_serializer='auth',
event_serializer='auth',
accept_content=['auth']
)
app.setup_security()
ノート
相対パスは許可されていませんが、これらのファイルには絶対パスを使用することをお勧めします。
また、 auth シリアライザーはメッセージの内容を暗号化しないため、必要に応じてこれを個別に有効にする必要があることにも注意してください。
侵入検知
侵入者からシステムを防御する際の最も重要な部分は、システムが危険にさらされているかどうかを検出できることです。
ログ
ログは通常、セキュリティ違反の証拠を探す最初の場所ですが、改ざんされる可能性がある場合は役に立ちません。
優れたソリューションは、専用のログサーバーを使用して集中ログを設定することです。 アクセスを制限する必要があります。 すべてのログを1か所にまとめるだけでなく、正しく構成すると、侵入者がログを改ざんしにくくなる可能性があります。
これは、syslogを使用してセットアップするのはかなり簡単です( syslog-ng および rsyslog も参照)。 Celeryはlogging
ライブラリを使用しており、syslogの使用をすでにサポートしています。
妄想のヒントは、UDPを使用してログを送信し、ログサーバーのネットワークケーブルの送信部分を切断することです:-)
トリップワイヤー
Tripwire は、(現在は商用の)データ整合性ツールであり、ファイルシステム内のファイルの暗号化ハッシュを保持するために使用されるいくつかのオープンソース実装を備えているため、管理者は変更時にアラートを受け取ることができます。 このようにして、被害が発生し、システムが危険にさらされたときに、侵入者が変更したファイル(パスワードファイル、ログ、バックドア、ルートキットなど)を正確に知ることができます。 多くの場合、これが侵入を検出できる唯一の方法です。
いくつかのオープンソースの実装は次のとおりです。
また、 ZFS ファイルシステムには、使用可能な整合性チェックが組み込まれています。
脚注