私の仕事のほとんどは、Django(a Python web framework))でウェブサイトを作成し、自分のサーバーまたはクライアントのサーバーに展開することです。私はvirtualenv
を使用して、サイトをシステムパッケージから分離し、おそらくそこに60〜80個のパッケージをインストールして、そのロットを20を超えるサイト間で共有します。
このアプローチに対するこの明らかな制限は、使用するパッケージをアップグレードする場合、すべてのサイトをテストする必要があることです。私は、かなりの数の個別のvirtualenvを維持する必要がないという公平なトレードオフを考えています。
そして、それは本質的に私の全体の問題です。 いったいどのようにvirtualenv
の展開を維持しているのでしょうか?人々は単にそれらをゴミ捨て場のように扱っているようですが、プログラミングユニバースがこの1週間で何かを学んだ場合= Ruby on Rails爆発、古いバージョンのソフトウェアの使用は受け入れられません。
最新のpip
を使用して現在のパッケージバージョンを確認する単純なスクリプトがありますが、正確ではありません。また、セキュリティのアップグレードと機能のアップグレード(何日もテストと修正が必要)を区別しません。
もっと良いものを探しています。 Djangoの新しいセキュリティリリースがリリースされた場合、またはサポートが終了した場合に通知することができるものを探しています。私を助けるための何かが必要です(および他のPython devops)スキャナーとスクリプトで子供たちの波が私たちのサーバーをボットネットに変換した後に泣く人々の次のバッチにはなりません。
そのようなものは存在しますか?
主要なGNU/Linuxディストリビューションには、ディストリビューション内のすべてのパッケージを安全に保つ責任がある専門のセキュリティチームがあります。これらのチームと調和するのに十分なリソースを費やすだけの余裕がない場合、(最高のセキュリティが目標である場合)最善の解決策は、彼らの作業に依存し、ディストリビューションのパッケージを使用することです。段階的なリリース( Debian など)を含むディストリビューションは、依存関係が壊れないように、パッケージにパッチを適用しようとします。
もちろん、ディストリビューションのパッケージを使用すると、Python仮想環境の柔軟性が失われます。したがって、これは別のトレードオフの三角形のようです:高セキュリティ、低コスト、インストールの柔軟性。2つ選択してください。 。
buildout を使用して、再現可能で分離されたデプロイメントを作成します。
ビルドアウトはvirtualenvのように機能し、卵をインストールして、それらをPythonインストールから分離した状態に保ちます。また、使用するバージョンを制御できるという点でpip
のように機能します。 。ただし、buildoutはビルドツールでもあり、アプリケーションやテストに合わせて、必要に応じて任意のパーツをビルドできるレシピを備えています。
私の仮想環境には、新しいプロジェクトの新しいブートストラップを作成するためのzc.buildout
Egg以外のものが含まれていません。
私が構築する典型的なビルドアウトには、開発、継続的インテグレーション、本番環境に適合するようにいくつかの構成ファイルがありますが、base.cfg
は常に次のようになります。
[buildout]
extends =
versions.cfg
newest = false
eggs = customer_project_name
[Django-base]
recipe = djangorecipe
settings = settings
eggs = ${buildout:eggs}
project = customer_project_name
projectegg = ${:project}
[python]
recipe = zc.recipe.Egg
interpreter = python
eggs = ${buildout:eggs}
initialization =
import os
os.environ['Django_SETTINGS_MODULE'] = '${Django:projectegg}.settings'
versions.cfg
を使用して、すべてのバージョンを固定し、偶発的なアップグレードを防ぎます。
versions.cfg
ファイルを使用しているため、すべてのバージョンファイルを解析して、影響を受けるプロジェクトを確認するのは簡単です(結局のところ、これはConfigParser
ファイルにすぎません)。パッケージのアップグレードは問題です。それらのピンを更新し、プロジェクトを再テストします。
テストが完了したら、更新されたバージョンの更新をお客様のサーバーにプッシュし、ビルドアウトを再実行します。
顧客向けのアップグレードウィンドウを計画、テスト、および検索する必要があるため、セキュリティ修正のアップグレードはいずれにしても専用のメンテナンスタスクであることに注意してください。
Dockerを使用することをお勧めします。Dockerは基本的なセキュリティ構造を提供し、自動的に更新され、完全に移植可能です。 Djangoサイトのデプロイは完全に苦痛ですが、Dockerを使用しているため、開発環境と本番環境はほとんど同じなので、プッシュとプルのみ=)
トピックに関するいくつかの良い読み:
http://pawamoy.github.io/2018/02/01/docker-compose-Django-postgres-nginx.html
requires.io の features をご覧ください。これはあなたが探しているもののようです。
BitbucketまたはGitHub-Accountは無料です。
それとは別に:
私は、公共部門の機密データを扱う必要がある状況で働いています。また、導入プラットフォームとしてCentOSを使用しています。ほとんどの場合、CentOSに付属する.rpm
packagesのセキュリティアップデートに依存しています。また、場合によっては、選択した必要な「python-packages」を独自にパッケージ化することもあります。当社のインフラストラクチャチームは、セルフパッケージされたものの既知のセキュリティ問題を追跡し、再パッケージを行います。これが私たちにとってどのように機能するかです。
PS:コンテナ側にいる場合は、コンテナイメージのスキャンと同様のサービスを提供する anchore があります。 。
エクスプロイトが存在する場合に通知を受け取るために、エクスプロイトについて通知するRSSフィード、サービス、および製品があります。少なくとも、管理者はおそらくCVEまたはNVD(CVEを含む)に従う必要があります。
Virtualenvではなく、アプリケーションで使用されるライブラリのエクスプロイトを管理する方法は?たとえば、ImageMagick、python実行可能ファイル自体、またはpythonが使用するシステムライブラリ。プラットフォームをアップグレードして、必要なvirtualenvとアプリケーションの検証。
私の仕事では、Pythonを含む独自のパッケージ(RPM)を作成します。システムライブラリのセキュリティ上の欠陥(プラットフォームのアップグレード、アプリケーションの検証)がある場合、私たちは同じ問題に直面しています。ただし、アプリケーションライブラリまたはpython自体は、ツールチェーンパッケージ内にあるため、簡単に管理できます。それを修正し、継続的インテグレーションビルドを通じて実行します。これにより、すべてのプロジェクトが再ビルドされ、新しいパッケージがすべて生成されます。ツールチェーンをアップグレードします。
pythonまたはDjango私が知っている)に固有の垂直統合ソリューションはありません。