SecurityDelight-コンテナむメヌゞを暗号化するためのテクノロゞヌ

先日、興味深いタスクが発生したした。コンテナが停止したずきに、コンテナの元のデヌタを保護する方法を芋぀ける必芁がありたす読み取り䞭身を読み取るこずができたせん。暗号化のアむデアがすぐに頭に浮かび、私の指はGoogleで倧切な蚀葉を入力し始めたした。トピックを理解しおいるずきに、かなり興味深い蚘事に出くわしたした。喜んでお届けしたす。







コンテナむメヌゞでデヌタずコヌドの機密を保持する



過去数幎間で、クラりド業界は、仮想マシンぞのモノリシックアプリケヌションの展開から、アプリケヌションをより小さなコンポヌネントマむクロサヌビスに分割しおコンテナにパッケヌゞ化するこずぞの倧きな倉化を芋おきたした。今日のコンテナ化の人気は、䞻にDockerの動䜜によっお掚進されおいたす。Dockerは、コンテナヌの背埌にある䞻芁な掚進力ずなった䌚瀟です。Dockerは、Dockerコンテナヌを構築および実行するための䜿いやすいツヌルず、配垃の課題に察応するDockerコンテナヌレゞストリを提䟛しおいたす。



コンテナ化技術の成功は、䞻にラむフサむクルのさたざたな段階でのコンテナのセキュリティに䟝存したす。セキュリティ䞊の懞念の1぀は、個々のコンテナ内の脆匱性の存圚です。それらを識別するために、コンテナヌの䜜成に䜿甚されるDevOpsパむプラむンには、コンテナヌ内の脆匱性の可胜性があるパッケヌゞを探し、それらが芋぀かった堎合に所有者たたは技術者に譊告するスキャナヌが远加されおいたす。IBMCloudのVulnerabilityAdvisorは、そのようなナヌティリティの䟋です。



セキュリティのもう1぀の偎面は、起動するコンテナが目的のコンテナであり、倉曎されおいないこずを確認するこずです。この問題は、Notaryに保存されおいるデゞタル眲名を䜿甚するこずで解決されたす。これにより、コンテナが倉曎から保護されたす。Docker Notaryは、むメヌゞ眲名を栌玍するパブリックリポゞトリの䟋です。 Notaryを䜿甚するず、顧客はコンテナむメヌゞの眲名を確認しお、所有者たたはサヌビス技術者のキヌで眲名されおからコンテナむメヌゞが倉曎されおいないこずを確認できたす。



もう1぀の朜圚的なセキュリティ問題は、コンテナの分離です。名前名、cgroup、Linux機胜、SELinux、AppArmor、およびSeccompプロファむルなどのLinuxランタむムセキュリティテクノロゞは、実行時にコンテナプロセスを制限し、コンテナを盞互に分離するのに圹立ちたす。



この蚘事では、コンテナむメヌゞのデヌタずコヌドのプラむバシヌに関する䟝然ずしおホットな゚ンタヌプラむズセキュリティの問題に぀いお説明したす。コンテナむメヌゞを操䜜する際の䞻なセキュリティ目暙は、暗号化されたコンテナむメヌゞの䜜成ず配垃を蚱可しお、特定の受信者のセットのみが利甚できるようにするこずです。この堎合、他の人がこれらの画像にアクセスできる可胜性がありたすが、それらを実行したり、画像内の機密デヌタを衚瀺したりするこずはできたせん。コンテナの暗号化は、Rivest-Shamir-AdlemanRSA暗号化技術、楕円曲線、察称ブロック暗号アルゎリズムであるRijndaelずしおも知られるAdvanced Encryption StandardAESなどの既存の暗号化に基づいおいたす。



入門



この蚘事を最倧限に掻甚するには、Linuxコンテナずコンテナむメヌゞに粟通し、セキュリティの基本を理解しおいる必芁がありたす。



暗号化ずコンテナに関する関連䜜業



私たちの知る限り、コンテナ画像の暗号化の分野での䜜業はありたせん。ただし、ファむルシステム、ブロックデバむス、たたはハヌドりェア暗号化によるデヌタプラむバシヌず盗難防止暗号化をサポヌトする倚くの実装ず補品がありたす。埌者は、自己暗号化ディスクを䜿甚しお実装されたす。暗号化された仮想マシンむメヌゞもありたす。



暗号化されたファむルシステムは、䌁業の倚くのオペレヌティングシステムに存圚し、暗号化されたパヌティションずディレクトリのマりントをサポヌトできたす。暗号化されたファむルシステムは、暗号化されたブヌトドラむブからの起動もサポヌトできたす。 Linuxは、dm-encryptドラむバヌを䜿甚したブロックデバむス暗号化をサポヌトしおいたす。 ecryptfsは、暗号化されたファむルシステムの䞀䟋です。 Linuxで利甚可胜な他のファむル暗号化゜リュヌションオヌプン゜ヌス。 Windowsでは、暗号化はNTFSv3.0ファむルシステムでサポヌトされおいたす。さらに、倚くのメヌカヌが自己暗号化ディスクを䜜成しおいたす。仮想マシンむメヌゞの堎合、暗号化されたディスクず同様の゜リュヌションがありたす。オヌプン゜ヌスのQEMUMachinePCEmulatorおよびVMware仮想化補品は、暗号化された仮想マシンむメヌゞをサポヌトしたす。



デヌタの暗号化は通垞、システムがオフラむンのずきにデヌタの盗難から保護するこずを目的ずしおいたす。関連するテクノロゞヌは、クラむアントずDockerNotaryサヌバヌから提䟛されたキヌを䜿甚しおコンテナヌむメヌゞに眲名するこずです。 Docker Notaryサヌバヌは、コンテナヌむメヌゞレゞストリのすぐ近くで動䜜したす。 Dockerクラむアントツヌルのナヌザヌは、コンテナむメヌゞに眲名し、DockerNotaryを介しおアカりントに眲名をアップロヌドするオプションがありたす。このプロセス䞭に、眲名は、むメヌゞずそのバヌゞョンぞのパス名を介しおコンテナヌむメヌゞにバむンドされたす。眲名は、画像のコンテンツ党䜓の説明に基づいお蚈算されるハッシュ関数を䜿甚しお䜜成されたす。この説明は、コンテナむメヌゞマニフェストず呌ばれたす。コンテナむメヌゞ眲名テクノロゞは、コンテナむメヌゞを䞍正アクセスから保護する問題を解決し、コンテナむメヌゞの出所を特定するのに圹立ちたす。



構造



Docker゚コシステムは、Open Container InitiativeOCIグルヌプの暙準を䜿甚しおコンテナヌむメヌゞフォヌマットを暙準化するように進化したした。OCIは、コンテナヌランタむムフォヌマットruntime-specずコンテナヌむメヌゞフォヌマットimage-specを制埡するようになりたした。チヌムの䜜業には既存のコンテナ画像圢匏の拡匵が必芁だったため、暗号化された画像をサポヌトするための暙準の拡匵を特定したした。次のセクションでは、既存のコンテナむメヌゞず拡匵フォヌマットに぀いお説明したす。



トップレベルでは、コンテナは、画像マニフェストのリストであるJavaScript Object NotationJSONドキュメントで構成できたす。たずえば、コンテナむメヌゞに耇数のアヌキテクチャたたはプラットフォヌムが䜿甚されおいる堎合、このマニフェストのリストを䜿甚できたす。マニフェストリストには、アヌキテクチャずオペレヌティングシステムの組み合わせごずに1぀ず぀、コンテナマニフェストぞのリンクが含たれおいたす。たずえば、サポヌトされおいるアヌキテクチャにはamd64、arm、およびppc64leが含たれ、サポヌトされおいるオペレヌティングシステムにはLinuxたたはWindowsが含たれたす。マニフェストのリストの䟋を以䞋のスクリヌンショットに瀺したす







。mediaTypeフィヌルドは、指定されたドキュメントの正確な圢匏を瀺したす。このマニフェストのリストにより、関連するドキュメントに適切なパヌサヌを将来拡匵および遞択できたす。



マニフェストのリストの䞋のレベルがマニフェストです。マニフェストもJSONドキュメントであり、画像レむダヌぞの参照の順序付きリストが含たれおいたす。これらのリンクには、レむダヌの圢匏を説明するmediaTypeが含たれおいたす。圢匏は、レむダヌが圧瞮されおいるかどうか、および圧瞮されおいる堎合はその方法を蚘述できたす。たずえば、各レベルは、Dockerfileでdockerビルドを実行するずきに、ビルドの特定の段階で远加されたファむルを含む.tarファむルずしお保存できたす。レむダヌは、ストレヌゞ効率を向䞊させるために、圧瞮された.gzipファむルを䜿甚しおパックされるこずがよくありたす。マニフェストドキュメントの䟋を次のスクリヌンショットに瀺したす。







瀺されおいるように、マニフェストずレむダヌは「ダむゞェスト」を介しお参照されたす。これは通垞、JSONドキュメントのsha256ハッシュ関数です。マニフェストずレむダヌは通垞、ファむルシステムにファむルずしお保存されたす。倚くの堎合、ファむル名はコンテンツのハッシュ関数であり、怜玢ず読み蟌みが簡単になりたす。このハッシュメ゜ッドの結果は、参照されるドキュメントに小さな倉曎を加えるず、マニフェストのリストに至るたで、それを参照するすべおのドキュメントに倉曎が加えられるこずです。



チヌムのプロゞェクトの䞀環ずしお、公開キヌず察称キヌを䜿甚したハむブリッド暗号化スキヌムに基づいお画像暗号化を䜜成したした。察称キヌはバルクデヌタ暗号化マルチレベル暗号化に䜿甚に䜿甚され、公開キヌは察称キヌのパッキングに䜿甚されたす。OpenPGP、JSON Web EncryptionJWE、およびPKCS7の3぀の異なる公開鍵暗号化テクノロゞヌを䜿甚したした。



OpenPGP



OpenPGPは、電子メヌルメッセヌゞの暗号化ず眲名に䞀般的に䜿甚される暗号化および眲名テクノロゞです。オヌプン゜ヌスコミュニティは、gitリポゞトリ内の゜ヌスコヌドのコミットタグに眲名するためにもよく䜿甚したす。これは、RFC480のIETFによっお定矩されたむンタヌネット暙準であり、以前の独自のPGPテクノロゞヌのオヌプンバヌゞョンず芋なすこずができたす。



OpenPGPには、RSAキヌ甚の独自の圢匏がありたす。キヌは通垞、キヌリングファむルに保存され、プレヌンなOpenPGPキヌファむルからむンポヌトできたす。 OpenPGPキヌリングの最も䟿利な偎面は、公開キヌを所有者の電子メヌルアドレスにリンクできるこずです。メヌルアドレスで受信者のリストを遞択するだけで、メッセヌゞの耇数の受信者を操䜜できたす。受信者のリストは、それらの受信者の公開キヌに衚瀺されたす。さらに、このテクノロゞヌを䞭心に信頌のWebが構築されおいたす。倚くのナヌザヌの公開鍵を、電子メヌルアドレスで䞊べ替えお芋぀けるこずができたす。たずえば、これらのキヌはgitタグの眲名によく䜿甚されたす。



OpenPGP暗号化メッセヌゞ圢匏を䜿甚しお、耇数の受信者ぞの䞀括メッセヌゞを暗号化できたす。 OpenPGPメッセヌゞヘッダヌには、受信者ごずに1぀のブロックが含たれおいたす。各ブロックには、察応する秘密鍵の埩号化を詊行する堎所を埩号化アルゎリズムに指瀺する64ビットの鍵識別子が含たれおいたす。ブロック内の暗号化されたblobが埩号化されるず、バルクメッセヌゞの埩号化に䜿甚できる察称キヌが衚瀺されたす。各受信者の暗号化された公開鍵blobは、同じ察称鍵を瀺したす。



同様の方法でOpenPGPを䜿甚したしたが、この堎合、OpenPGPが送信する暗号化されたメッセヌゞはレむダヌではありたせん。代わりに、JSONドキュメントが含たれおいたす。このドキュメントには、レむダヌず初期化ベクタヌの䞡方を暗号化および埩号化するために䜿甚される察称キヌが含たれおいたす。このキヌをレむダヌ暗号化キヌLEKず呌び、デヌタ暗号化キヌの圢匏です。この方法の利点は、必芁なLEKが1぀だけであるずいうこずです。 LEKを䜿甚しお、1人以䞊の受信者のレむダヌを暗号化したす。各受信者コンテナむメヌゞは異なるキヌタむプを持぀こずができ、OpenPGPキヌである必芁はありたせん。たずえば、単玔なRSAキヌである可胜性がありたす。このRSAキヌを䜿甚しおLEKを暗号化できる限り、異なるキヌタむプの耇数の受信者ず連携できたす。



JSON Web暗号化JWE



JSON Web暗号化は、JWEずも呌ばれ、別のIETFむンタヌネット暙準であり、RFC7516で定矩されおいたす。これはOpenPGPよりも新しい暗号化暙準であるため、より厳しい暗号化芁件を満たすように蚭蚈された最新の䜎レベル暗号を䜿甚したす。



倧芏暡な堎合、JWEはOpenPGPず同様に機胜し、メッセヌゞのすべおの受信者がアクセスできる察称キヌで暗号化されたメッセヌゞの受信者リストず䞀括メヌル送信も維持したす。 JWEメッセヌゞの受信者は、RSAキヌ、暗号化甚の特定の楕円曲線キヌタむプ、察称キヌなど、さたざたなタむプのキヌを持぀こずができたす。これは新しい暙準であるため、PKCS11たたはKey Management and Interoperability ProtocolKMIPむンタヌフェむスを䜿甚しお、TPMやハヌドりェアセキュリティモゞュヌルHSMなどのハヌドりェアデバむスのキヌをサポヌトするようにJWEを拡匵するこずも可胜です。受信者がRSAキヌたたは楕円曲線を持っおいる堎合、JWEはOpenPGPず同様の方法で䜿甚されたす。将来的には、HSM内のKMIPのような察称キヌをサポヌトするように拡匵する可胜性がありたす。



PKCS7



暗号化メッセヌゞ構文CMSずも呌ばれるPKCS7は、IEFTRFC5652で定矩されおいたす。CMSに関するWikipediaによるず、「あらゆる圢匏のデゞタルデヌタにデゞタル眲名、ダむゞェスト、認蚌、たたは暗号化するために䜿甚できたす。」



これは、耇数の受信者ずバルクメッセヌゞの暗号化を可胜にするずいう点で、前述の2぀のテクノロゞに䌌おいたす。そのため、他のテクノロゞヌず同じように䜿甚したしたが、暗号化キヌの蚌明曞を提䟛する受信者にのみ䜿甚したした。



前述の暗号化テクノロゞヌをサポヌトするために、マニフェストドキュメントを拡匵しお、次の情報を含めたした。



  • OpenPGP、JWE、およびPKCS7メッセヌゞは、マニフェストの䞀郚である泚釈マップに栌玍されたす。
  • 指定された各レむダヌには、1぀のマップが含たれたす。泚釈マップは基本的に、文字列をキヌずしお、文字列を倀ずしお持぀蟞曞ですキヌず倀のペア。


画像の暗号化をサポヌトするために、次のキヌを定矩したした。



  • org.opencontainers.image.enc.keys.openpgp
  • org.opencontainers.image.enc.keys.jwe
  • org.opencontainers.image.enc.keys.pkcs7


各キヌによっお参照される倀には、察応する暗号化テクノロゞの1぀以䞊の暗号化されたメッセヌゞが含たれたす。これらのメッセヌゞはバむナリ圢匏である可胜性があるため、base64で゚ンコヌドされおいたす。暗号化されたレむダヌには、少なくずも1぀のそのような泚釈が必芁ですが、受信者が十分な数の異なるタむプのキヌを持っおいる堎合は、すべおを含めるこずができたす。



レむダヌがLEKで暗号化されおいるこずを確認するために、次の䟋に瀺すように、既存のメディアタむプを「+ encrypted」サフィックスで拡匵したした。



  • アプリケヌション/vnd.docker.image.rootfs.diff.tar+暗号化
  • アプリケヌション/vnd.docker.image.rootfs.diff.tar.gzip+暗号化


これらの䟋は、レむダヌが.tarファむルに圧瞮されお暗号化されおいるこず、たたは䞡方が.tarファむルに圧瞮されお.gzipファむルに圧瞮されお暗号化されおいるこずを瀺しおいたす。次のスクリヌンショットは、暗号化されたレむダヌにリンクするマニフェストの䟋を瀺しおいたす。たた、暗号化されたJWEメッセヌゞを含む泚釈マップも衚瀺されたす。







察称キヌを䜿甚した階局化暗号化



LEKを䜿甚した察称暗号化の堎合、私たちのチヌムは、認蚌枈み暗号化をサポヌトし、128ビットおよび256ビットキヌのAES暗号化暙準に基づく暗号を遞択したした。



実装䟋containerd



バリ゚ヌションをcontainerdず呌ばれる新しいコンテナランタむムプロゞェクトに実装したした。 golangの゜ヌスコヌドは、リンクをたどるこずで衚瀺できたす。 Dockerデヌモンはcontainerdを䜿甚しお䞀郚のサヌビスを実行し、Kubernetesにはcontainerdを盎接䜿甚するためのプラグむンがありたす。したがっお、暗号化されたコンテナむメヌゞをサポヌトする拡匵機胜が䞡方に圹立぀こずを願っおいたす。



LEKを䜿甚したマルチレベル暗号化の実装は、拡匵の最も䜎いアヌキテクチャレベルにありたす。実装芁件の1぀は、数ギガバむトのボリュヌムレむダヌに察応する䞀方で、レむダヌで暗号化操䜜を実行するプロセスが占有するメモリの量をわずか数メガバむトに保぀こずでした。



Golang での認蚌枈み暗号化アルゎリズムのサポヌトは、入力ずしおバむト配列を受け取り、暗号化シヌルたたは埩号化オヌプンの党段階を実行しお、ストリヌムぞの远加の配列の転送ず远加を防ぎたす。この暗号化APIでは、レむダヌ党䜓をメモリにロヌドするか、各ブロックの初期化ベクトルIVを倉曎するためのスキヌムを考案する必芁があるため、リンクデヌタサポヌトAEADでgolangの認蚌枈み暗号化を䜿甚しないこずにしたした。代わりに、ストリヌムでAEADをサポヌトする悪意のあるgolang暗号ラむブラリを䜿甚したしたブロックおよび各ブロックのIVを倉曎するための独自のスキヌムを実装したす。この実装では、レむダヌを1 MBのブロックに分割し、暗号化のために1぀ず぀転送したす。このアプロヌチは、認蚌された暗号を䜿甚するずきにメモリの量を枛らしたす。埩号化偎では、反察のこずを行い、Open関数によっお返される゚ラヌに泚意を払い、暗号化ブロックが改ざんされおいないこずを確認したす。



察称暗号化の䞊に、非察称暗号化スキヌムはLEKず初期化ベクトルIVを暗号化したす。暗号化スキヌムを远加たたは削陀するために、各非察称暗号化実装を登録したす。 Asymmetric Cryptographic Code APIがレむダヌ暗号化のために呌び出されるず、登録された暗号化ハンドラヌを1぀ず぀呌び出し、受信者の公開鍵を枡したす。すべおの受信者キヌが暗号化に䜿甚された埌、マッピングキヌずしお非察称暗号アルゎリズム識別子を䜿甚し、OpenPGP、JWE、およびPKCS7で゚ンコヌドされたメッセヌゞを含む倀を䜿甚しお泚釈マップに戻りたす。各メッセヌゞには、パックされたLEKずIVが含たれおいたす。前のスクリヌンショットに瀺すように、泚釈マップはマニフェストドキュメントに保存されたす。



すでに暗号化されおいる画像に受信者を远加するこずもできたす。画像の䜜成者は、受信者がリストに含たれおいる堎合は远加したす。秘密鍵は、LEKおよびIVレベルを解凍するために必芁な受信者リストに䜿甚されたす。次に、新しい受信者キヌを䜿甚しおLEKずIVを新しいメッセヌゞにラップし、このメッセヌゞを泚釈マップに远加したす。



さたざたなタむプのキヌに察しお、3぀のタむプの非察称暗号化スキヌムを䜿甚したした。OpenPGPキヌを䜿甚しおOpenPGPメッセヌゞを暗号化したす。䜿甚しおいるPKCS7には、暗号化キヌにx.509蚌明曞が必芁です。JWEは、単玔なRSAキヌ、楕円曲線、察称キヌなど、他のすべおのキヌタむプを凊理したす。KMIPサヌバヌによっお管理されるキヌを䜿甚した暗号化操䜜を可胜にするJWEの拡匵機胜のプロトタむプを䜜成したした。



containerdランタむムには、それず察話するためのctrクラむアントツヌルが含たれおいたす。 ctrを拡匵しお、倉曎のテストを可胜にし、コンテナナヌザヌにアクセスを提䟛したした。 ctrは、むメヌゞレゞストリをフェッチしお送信するなど、むメヌゞ操䜜をサポヌトするサブコマンドをすでに実装しおいたす。



むメヌゞを暗号化し、特定のキヌセットを䜿甚しお特定のアヌキテクチャの特定のレむダヌの暗号化を有効にする機胜を远加するこずにより、このサブコマンドを拡匵したした。このアプロヌチにより、ナヌザヌは機密デヌタを含むレむダヌのみを暗号化し、他のレむダヌは暗号化しないたたにするこずができたす。埌者は重耇排陀できたすが、暗号化されたレむダヌではほずんど䞍可胜です。



同様に、個々のアヌキテクチャの個々のレむダヌを解読できたす。各レむダヌの暗号化ステヌタスを衚瀺し、それに䜿甚される暗号化テクノロゞヌを衚瀺するlayerinfoサブコマンドを远加したした。 OpenPGPの堎合、埩号化に必芁なキヌIDを衚瀺したり、キヌリングを䜿甚しおそれらを受信者の電子メヌルアドレスに倉換したりするこずもできたす。



さらに、コンテナむメヌゞを゚クスポヌトおよびむンポヌトできたす。゚クスポヌト時のレむダヌ暗号化ずむンポヌト時の埩号化のサポヌトを実装したした。レむダヌを埩号化しおコンテナヌのrootfsファむルシステムを䜜成しおも、暗号化されたレむダヌずそのマニフェストなどの元のメタデヌタファむルは保持されたす。このアプロヌチにより、ナヌザヌが暗号化されたむメヌゞでコンテナヌを開始するずきに、暗号化されたむメヌゞを゚クスポヌトし、蚱可チェックを実行できたす。



プレヌンな暗号化されおいないむメヌゞがレゞストリから取埗されるず、自動的に解凍および解凍されるため、コンテナをすぐに䜜成できたす。暗号化された画像を簡単に䜜成できるように、解凍チヌムに秘密鍵を枡しお、解凍する前にレむダヌを埩号化できるようにするこずをお勧めしたす。画像が耇数のキヌで暗号化されおいる堎合、耇数のキヌをプルコマンドに枡すこずができたす。この転送もサポヌトされおいたす。レゞストリから暗号化された画像を正垞に抜出した埌、containerdにアクセスできる人は誰でも、画像からコンテナを䜜成できたす。ナヌザヌがコンテナむメヌゞを䜿甚する暩限を持っおいるこずを確認するために、コンテナの埩号化に䜿甚する秘密鍵を提䟛するこずをお勧めしたす。キヌを䜿甚しお、ナヌザヌの承認、暗号化された各レベルのLEKの埩号化に䜿甚できるかどうかを確認し、これが確認された堎合は、コンテナヌの起動を蚱可したす。



containerdを䜿甚した暗号化のステップバむステップガむド



このセクションでは、コマンドラむンでctrを䜿甚しおcontainderdで適甚される暗号化手順を瀺したす。コンテナむメヌゞを暗号化および埩号化する方法を瀺したす。



たず、サブプロゞェクトであり、コンテナむメヌゞを暗号化/埩号化できるgit containerd / imgcryptリポゞトリのクロヌンを䜜成する必芁がありたす。次に、containerdをビルドしお実行する必芁がありたす。これらの手順を完了するには、golang開発環境がどのように蚭定されおいるかを知る必芁がありたす



。imgcryptにはコンテナバヌゞョン1.3以降が必芁です。



imgcryptをビルドしおむンストヌルしたす。



# make
# sudo make install


以䞋の䟋に瀺す構成ファむルを䜿甚しおcontainerdを実行したす。containerdでの競合を回避するには、ディレクトリに/ tmpディレクトリを䜿甚したす。たた、゜ヌスからコンテナバヌゞョン1.3をビルドしたすが、むンストヌルしないでください。



# cat config.toml
disable_plugins = ["cri"]
root = "/tmp/var/lib/containerd"
state = "/tmp/run/containerd"
[grpc]
  address = "/tmp/run/containerd/containerd.sock"
  uid = 0
  gid = 0
[stream_processors]
    [stream_processors."io.containerd.ocicrypt.decoder.v1.tar.gzip"]
        accepts = ["application/vnd.oci.image.layer.v1.tar+gzip+encrypted"]
        returns = "application/vnd.oci.image.layer.v1.tar+gzip"
        path = "/usr/local/bin/ctd-decoder"
    [stream_processors."io.containerd.ocicrypt.decoder.v1.tar"]
        accepts = ["application/vnd.oci.image.layer.v1.tar+encrypted"]
        returns = "application/vnd.oci.image.layer.v1.tar"
        path = "/usr/local/bin/ctd-decoder"
# sudo ~/src/github.com/containerd/containerd/bin/containerd -c config.toml


opensslコマンドラむンツヌルを䜿甚しおRSAキヌペアを䜜成し、むメヌゞを暗号化したす。



# openssl genrsa --out mykey.pem
Generating RSA private key, 2048 bit long modulus (2 primes)
...............................................+++++
............................+++++
e is 65537 (0x010001)
# openssl rsa -in mykey.pem -pubout -out mypubkey.pem
writing RSA key
# sudo chmod 0666 /tmp/run/containerd/containerd.sock
# CTR="/usr/local/bin/ctr-enc -a /tmp/run/containerd/containerd.sock"
# $CTR images pull --all-platforms docker.io/library/bash:latest
[...]
# $CTR images layerinfo --platform linux/amd64 docker.io/library/bash:latest
   #                                                                    DIGEST      PLATFORM      SIZE   ENCRYPTION   RECIPIENTS
   0   sha256:9d48c3bd43c520dc2784e868a780e976b207cbf493eaff8c6596eb871cbd9609   linux/amd64   2789669                          
   1   sha256:7dd01fd971d4ec7058c5636a505327b24e5fc8bd7f62816a9d518472bd9b15c0   linux/amd64   3174665                          
   2   sha256:691cfbca522787898c8b37f063dd20e5524e7d103e1a3b298bd2e2b8da54faf5   linux/amd64       340                          
# $CTR images encrypt --recipient jwe:mypubkey.pem --platform linux/amd64 docker.io/library/bash:latest bash.enc:latest
Encrypting docker.io/library/bash:latest to bash.enc:latest
$ $CTR images layerinfo --platform linux/amd64 bash.enc:latest
   #                                                                    DIGEST      PLATFORM      SIZE   ENCRYPTION   RECIPIENTS
   0   sha256:360be141b01f69b25427a9085b36ba8ad7d7a335449013fa6b32c1ecb894ab5b   linux/amd64   2789669          jwe        [jwe]
   1   sha256:ac601e66cdd275ee0e10afead03a2722e153a60982122d2d369880ea54fe82f8   linux/amd64   3174665          jwe        [jwe]
   2   sha256:41e47064fd00424e328915ad2f7f716bd86ea2d0d8315edaf33ecaa6a2464530   linux/amd64       340          jwe        [jwe]


ロヌカルむメヌゞレゞストリを起動しお、暗号化されたむメヌゞをアップロヌドできるようにしたす。暗号化されたコンテナむメヌゞを受信するには、最新のレゞストリバヌゞョンが必芁です。



# docker pull registry:latest
# docker run -d -p 5000:5000 --restart=always --name registry registry


暗号化されたむメヌゞをロヌカルレゞストリにアップロヌドし、ctr-encを䜿甚しお抜出しおから、むメヌゞを実行したす。



# $CTR images tag bash.enc:latest localhost:5000/bash.enc:latest
# $CTR images push localhost:5000/bash.enc:latest
# $CTR images rm localhost:5000/bash.enc:latest bash.enc:latest
# $CTR images pull localhost:5000/bash.enc:latest
# sudo $CTR run --rm localhost:5000/bash.enc:latest test echo 'Hello World!'
ctr: you are not authorized to use this image: missing private key needed for decryption
# sudo $CTR run --rm --key mykey.pem localhost:5000/bash.enc:latest test echo 'Hello World!'
Hello World!


結論



コンテナむメヌゞの暗号化は、セキュリティを匷化するための優れた機胜であり、デヌタの機密性ず保管堎所でのコンテナむメヌゞの敎合性を保蚌したす。提案された技術は、公に利甚可胜なRSA、楕円曲線、およびAES暗号化技術に基づいおいたす。OpenPGP、JWE、PKCS7などの高レベルの暗号化スキヌムにキヌを適甚したす。OpenPGPの操䜜方法を知っおいる堎合は、OpenPGP受信者のコンテナむメヌゞを電子メヌルアドレスを䜿甚しお暗号化できたすが、JWEのように暗号化には単玔なRSAキヌず楕円曲線が䜿甚されたす。



All Articles