파이썬 암호화

공개 키 암호화가 쉬워졌습니다.

C05348A3-9AB8-42C9-A6E0-81DB3AC59FEB
           

배포 매개변수 보안에 대한 DevOps 관점

Unsplash Towfiqu barbhuiya 사진

배포 매개변수 공개 키 보안에 대한 DevOps 관점

코드 빌드 및 배포 자동화는 많은 훌륭한 일을 위한 길을 열었습니다. 월별 수동 코드 릴리스의 시대는 이미 지났습니다. 최신 CI/CD 파이프라인은 이제 개발 및 스테이징 환경의 자동화된 테스트를 프로덕션으로 전달하는 모든 코드 커밋을 릴리스할 수 있습니다.

이 마법을 실현하기 위해 DevOps 팀은 환경에 구애받지 않는 코드를 빌드해야 합니다. 정확히 동일한 코드를 DEV, TEST, STAGE에 배포한 다음 PROD에 배포해야 하며 배포 시 적절한 매개변수를 전달하여 솔루션이 적절하게 작동하도록 해야 합니다. 마이크로서비스 아키텍처와 함께 작동하도록 배포된 후 서로를 발견해야 하는 독립적인 하위 구성요소의 분리는 이 작업을 매우 어려운 작업으로 만듭니다. 이러한 배포 매개변수를 추적하면 이러한 모든 순진한 구성 요소가 주어진 환경에서 함께 작동하도록 만드는 "접착제" 자체가 새로운 과제가 되었습니다.

일반적인 지식이지만 한 번 더 반복하는 것은 나쁘지 않을 것입니다. 어떤 상황에서도 API 키를 비롯한 모든 종류의 자격 증명을 코드나 컨테이너 이미지에 포함해서는 안 됩니다. 코드 저장소 또는 이미지 레지스트리에 업로드된 자격 증명은 손상된 것으로 간주되어 즉시 변경되어야 합니다.

그러나 다음과 같이 질문할 수 있습니다. 소스 코드 저장소에서 이러한 귀중한 배포 매개변수를 추적할 수 없다면 무엇을 할 수 있습니까? 이러한 중요한 값을 버전 제어 리포지토리에 보관하는 것은 좋은 생각이지만 암호화되어 있는 한. 공개/개인 키 암호화는 암호화된 비밀을 개인 키 없이는 복호화할 수 없기 때문에 최상의 솔루션을 제공하므로 복호화 키가 없는 한 비공개 GitHub 리포지토리에 안전하게 업로드할 수 있습니다.

좋은 오래된 구성 파일 또는 ".INI" 파일은 다양한 환경을 나타내는 여러 섹션에 다른 값을 가진 동일한 키 이름을 저장할 수 있기 때문에 배포 매개변수를 저장하는 데 놀라울 정도로 적합합니다. 예를 들어:

[DEFAULT]
db_user = dbuser
[DEV]
db_pwd = devpassword
[PROD]
db_pwd = prodpassword

내 데이터베이스 사용자 이름 db_user의 값은 모든 섹션(DEFAULT)에 대해 동일하지만 db_pwd의 값은 PROD와 DEV에서 다를 수 있습니다.

rsa_crypto Python 라이브러리 및 명령줄 유틸리티를 사용하면 구성 파일에 값을 저장하는 유연성과 개인/공개 키 암호화의 보안을 결합할 수 있습니다. Windows, Mac 및 Linux용 자체 포함 바이너리 파일도 편리하게 사용할 수 있습니다.

첫 번째 단계는 새 키를 생성하는 것입니다.

rsa_crypto create
Enter key password:
Re-enter key password:
Creating key...
Created password-protected private/public keys file /Users/me/rsa_key.bin
Use the "extract" keyword to create public and private key files.

기본적으로 이 도구는 새로운 4096비트 RSA 키 쌍(비밀)을 생성하고 이를 단일 파일에 저장합니다. 이 파일은 PKCS#8 표준을 충족하고 scrypt 키 파생 기능을 사용하여 무차별 대입 사전 공격을 방지하는 암호로 보호됩니다. 키는 좋은 암호로 안전하지만 여전히 코드 저장소에 저장해서는 안 됩니다.

아직 다른 암호가 있는 것은 배포 자동화에 적합하지 않습니다. 이 도구는 또한 해당 암호 보호 파일을 암호가 필요 없는 별도의 공개 및 개인 키 파일로 추출하는 방법을 제공합니다.

rsa_crypto extract
Using key: /Users/me/rsa_key.bin
Opening encrypted key.
Enter key password:
Created private key file /Users/me/rsa_private.pem (File can decrypt data and is not password-protected, keep it safe!)
Created public key file /Users/me/rsa_public.pem (distribute this one to anyone who needs to encrypt data, it cannot be used for decryption!)

공개 키 파일은 값을 암호화할 수 있어야 하는 모든 사람에게 안전하게 배포될 수 있으며 암호 해독에 사용할 수 없습니다. 자격 증명은 일반적으로 대부분의 조직에서 별도의 그룹에서 관리되므로 이는 훌륭한 옵션입니다.

반대로 개인 키는 암호 없이 값을 해독하는 데 사용할 수 있으므로 각별히 주의해야 합니다. 이 도구는 현재 디렉터리(명령을 실행 중인 디렉터리), 스크립트가 있는 디렉터리 및 사용자의 홈 디렉터리에서 이러한 키 파일을 찾습니다. 또한 많은 상황에서 더 나은 옵션이 될 수 있는 환경 변수로 키 파일을 찾습니다.

export rsa_private=$(cat /Users/me/rsa_private.pem)

그러면 개인 키 파일을 안전하게 삭제할 수 있으며 항상 암호로 암호화된 키 파일에서 다시 생성할 수 있습니다.

rsa_crypto clear 
Using key: /Users/me/rsa_private.pem
Private key deleted: /Users/me/rsa_private.pem

이 도구를 -k 옵션과 함께 사용하여 다른 키 이름 접두사를 지정할 수도 있습니다. 이를 통해 사용자는 다양한 환경이나 목적에 대해 여러 키를 가질 수 있으며 다른 팀에서 관리하는 자격 증명을 사용할 수 있습니다.

rsa_crypto create -k dev
Enter key password:
Re-enter key password:
Creating key...
Created password-protected private/public keys file /Users/me/dev_key.bin
Use the "extract" keyword to create public and private key files.

스크립트의 이 get 및 set 매개변수를 사용하여 구성 파일에 암호화된 값을 저장하고 검색할 수도 있습니다. 구성 파일이 이미 존재해야 합니다.

touch ~/.rsa_values.conf

파일의 구조는 매우 간단하며 대괄호 [MY_SECTION]로 구분된 섹션이 포함되어 있습니다. 섹션 이름은 대소문자를 구분할 수 있습니다. [DEFAULT] 섹션이 기본적으로 사용됩니다.

그러면 각 섹션에는 여러 "옵션"과 값(키/값 쌍)이 포함됩니다. 값만 암호화되고 옵션 이름은 일반 텍스트로 유지됩니다.

이 구조는 DEV, TEST 및 PRODUCTION 환경에서 데이터베이스 암호를 추적하는 것과 같이 환경에 따라 달라야 하는 값을 추적하는 데 매우 적합합니다.

기본 암호화 키를 사용하여 DEV 섹션에 database_password라는 옵션 값을 저장하려면:

rsa_crypto set -s DEV -o database_password
Using key: /Users/me/Documents/rsa_public.pem
Enter value:
DEV my_password
set
Updated /Users/me/.rsa_values.conf

값을 지정하지 않으면 명령줄 기록에 표시되지 않도록 스크립트에서 값을 묻는 메시지를 표시합니다. 선택적으로 원하는 경우 -v 매개변수를 사용하여 값을 명령줄 매개변수로 지정할 수도 있습니다.

rsa_crypto set -s DEV -o database_password -v my_secret_password
Using key: /Users/me/Documents/rsa_public.pem
DEV my_secret_password
set
Updated /Users/me/.rsa_values.conf

값을 해독하려면:

rsa_crypto get -s DEV -o database_password
Using key: /Users/me/rsa_private.pem
get
Reading from /Users/me/.rsa_values.conf
DEV database_password my_secret_password
my_secret_password

위의 예에서 rsa_private.pem 개인 키를 사용하면 암호를 묻지 않고 데이터를 해독할 수 있습니다. 다시 한 번 말하지만 해당 파일을 가진 사람은 누구나 데이터를 해독할 수 있으므로 매우 주의해야 합니다 . 개인 키가 없는 경우 스크립트는 보호된 키 쌍 파일 rsa_key.bin을 열기 위한 암호를 묻는 메시지를 표시합니다.

rsa_crypto clear
Using key: /Users/me/rsa_private.pem
Private key deleted: /Users/me/rsa_private.pem
rsa_crypto get -s DEV -o database_password
Using key: /Users/me/rsa_key.bin
Opening encrypted key.
Enter key password:
get
Reading from /Users/me/.rsa_values.conf
DEV database_password my_secret_password
my_secret_password

이제 PROD 암호를 설정하고 가져옵니다.

rsa_crypto set -s PROD -o database_password -v super-secret
Using key: /Users/me/Documents/workspaces/rsa_public.pem
PROD super-secret
set
Updated /Users/me/.rsa_values.conf
rsa_crypto get -s PROD -o database_password
Using key: /Users/me/rsa_key.bin
Opening encrypted key.
Enter key password:
get
Reading from /Users/me/.rsa_values.conf
PROD database_password super-secret
super-secret

.rsa_values.conf 구성 파일의 내용은 다음과 같습니다.

cat ~/.rsa_values.conf
[DEFAULT]
test = VvXy8NcqL94lBDYS56EnQm03vq9Kvg17VNU1Tu0T1j_hn-OxOTmXv_NoQHWcvWZuJto4awbq1Y_yvi_MKYE5uXOv15iVBZAuHO_xlUmujrL9pdUfxnBe8SAzH7sy2GTx42tLkb2MB9E-49GmKYqbx9dBzTNRDJj8D8LDZku6CJeSDPGy9l6UzG2vl53V3GY97an4Gb4UJ7XYEeEqMsZFRqaxgdWd_IMA_L5FtAlEaU3j4SYvqq-9QDxuab0vv8ZgzP6KuR05jXcLTrEZdrfmy_zRHuLiThu5_-ofsUNoXGNByGWAdBuuMONQj1s2QiI7qsqbFw66RBh0zUMzF2XFtSHY4AklF6uiDkieAhjBldbIjGEhrt3eMVBRBtRIDQ-LlYMcP8HnMPjBe-FBn8rYNscDrOWJIcqyTXwspfnyI6iSjEfTNQilMG6V17NXaJNipbJpoFm0aiKokZXawgav9yWWXAjRitMBtCGbqeEXVw704uY2s2K0m8XQhBLuwtCSS2Q616e4CgBxhEZOHNC0FPDpLWgvUwSFJ9vLphYSEQXeak3GRPDUfzxnjIUi8uLtifJGVEUycyRf8PV_Zf-0i8SAxFbB9OYawAKBpwwTGt4B8Pir351AcID4-s-9TG7LwrOxDvDiGxTH6Kho0SnMubXdpfDESFlwb61KzD3Yap0=
[dev]
test = Nfe5yc-FegHyEODNAX-ndIs8kf6Tjn1V3fjy7PSZ4J4NuOq7bOHCfooVb2mK4KS7Q0U8MSIIo_JmAZVqY__CvWR4zaczr4Es1d64YNX8CyVKvfIK7sPVSfv-v54-edcdtKHEj6dJRo1Pdbvc8ESgMxEUK9J64lS0FloZoXJGE1NVdkgf19IX4ZlHm2XjhyQ1pgfEg0cJPqDukM6cHfXwqexVjWGGF9-eYw6jeUFm59O3_D5Z44ull9HCdEtG85Hv99R4lpQJWYRLF1b7-HPPnyAoXwnCuR-mKi7KdiZw4q_bTruuKYltTKIYbMxXzW5m-kjNUcHSaYdOxSGVbOYdhMiBOnvTRZS5KVVpJCfS5fkQG2HLRlkRhW2PWwaG8ieP-bXvK7jvImKqRbGryPNHtdNBSv3yIXhQKqHfs6JxVXg_pBJywv7q-oymxw4hk3jf11CyZaDmAS-XQQU0KxnnkJ7Cm1h1KYVSfFMZWw9teEd3fRsiBktqPaIOnw0U5liK5WG52uBN_hdoAM73aOpsuDLPy1fYEL5Wuw3nuSZt48Gf7q6AFWS8WRCwIXa0oJJjudObfkeCw7jA0-ufIEHa4wBk2X93D2Mjr-nLOSayLM71UOdT94B4-2oVV-44Djuo-iY3iKQQkllFvuQmZr2Ozs68knOA70qbIYewVBcO4fY=
[DEV]
database_password = YrUidTfrK3w-y2KneYUSWugR0IVjmPvBpjqlBZ_5Oic5td0rO2aeWOuyeiujSe7G9YoBnKLxtIkGGzeOs0EQ6kEJCmLCq2MVNOECj4__majFlmp3De_ypebwq0SbRn4UGRzrGSV6oO93jnoHpH8Rky2L5yeJMAqjwsMAgOQBrfdpdcgqLRATUumoaRkvfMafdTYKjhJj5m6EUB9-la8YPK9kxMKu2-l9GlEnqug5S91xAOXb2laX2b3T5KCeQxxAZ2L9KtUG0NJulmaEtUFoRNWSVyBLsAvDdRkXoYXuHLSIhD-8x1RwxOjPyJ-t4cc7uNJF8ZfCsLHuesQj4jauXSmiVe5wI718rC4PS9kYH5Z5IKgl19d7jRaUI2jx-lPs4Rues1SZpHQKpH8GG3Id7z5RAtJ3OdlCrx7b3uOPL5GinlG4QdyiF7ROIsShAZPTdrQybRDDCU8ju-6R0RkMO8Qds7VNRANSwXYQAn2D62IQx3cAr40TMOHy697QgklomfT-k52GCQsfyJqFASYJ4DDhnjZB8uXzx1eHLhmVTikVt1yYXjoPOD0HPX0uYTd8L-TNwU9OnU36Q8m9dTez9rUHrX2xKapkYf0SIRPeSiLRbey_h9tnynoQYXtKsca-jxdBUDZvw2t_KbU__z_zuRWv65CrJpkcBGMvYkqeXj4=
[PROD]
database_password = g1G_zRij0D6nerTHn1bJ7fr_HiWLFv4Qi-a2Y9QfjeWy5lRCO4L_9ENuiG4hbqyJj2NtbLJ7-NCpN3wd_i8djTGcY2yTcgsFZQEceco-n1bK9yX3Fq8Go1r2D82ccdlNSASeFwA5XDEiBbjpDmsgeawYQNJJUC84oAdv52cFIqTVHecYXGp8cr93eUI3Cpj8Q67zoMH3bJNXkF1KIcFCdrlFfwOQA3RsVuoYdw_JXztVAGaUBWfnBKWjDuTcM9WJyB2-Zfw8Pv0W4Dd2YkJvjvMcCJakxoVEz1OGFBlLyBwleTXBQVKLxGBkK7Xfr7s0FArM6yBAe5BFOfd-vfNeoR38X-Rc00ojUTpbsforLKTWuvHGx1tXi8F5b7TAhNKsICptmBn52ZZmYQjCyIktgL_v0Trngk0Y3uYiaAZpFJyvNHcebjSJ445c_knbcFdn158tud9WX8dHOcXcx5LXFrfh-hU1Vc0U6MUVXgja7T_-O5N59Hob4DIyb4sHF8x-FGFiBvZK-dvIY_FDt82Z0Bk-AETPCykdkmtTx4eg-_o2eEb9ewKHlgLpnBjUs1FajMcfGYiQnaRQNfubBRHY34nmdJtfqQVqVIcQkD0N19qI-8Mg0RSwLaxKSDPlK06JdZew1Nrli-l7U5wYZV4zLdIzXG4tqy6qIb_8Y5yMXm0=

이 도구는 -f 옵션을 사용하여 Kubernetes Parameter Store .yaml 구성 파일과 같은 전체 파일을 암호화하는 데 사용할 수도 있습니다.

댓글을 게시했습니다: 0