ã³ã³ããã€ã¡ãŒãžã§ããŒã¿ãšã³ãŒãã®æ©å¯ãä¿æãã
é廿°å¹Žéã§ãã¯ã©ãŠãæ¥çã¯ãä»®æ³ãã·ã³ãžã®ã¢ããªã·ãã¯ã¢ããªã±ãŒã·ã§ã³ã®å±éãããã¢ããªã±ãŒã·ã§ã³ãããå°ããªã³ã³ããŒãã³ãïŒãã€ã¯ããµãŒãã¹ïŒã«åå²ããŠã³ã³ããã«ããã±ãŒãžåããããšãžã®å€§ããªå€åãèŠãŠããŸããã仿¥ã®ã³ã³ããåã®äººæ°ã¯ãäž»ã«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ããŒãšæ¥åæ²ç·ã䜿çšãããŸãã