programing

git 저장소에서 암호를 처리하는 가장 좋은 방법은 무엇입니까?

padding 2023. 5. 18. 20:47
반응형

git 저장소에서 암호를 처리하는 가장 좋은 방법은 무엇입니까?

트위터에 접속해서 특정 상황에서 으르렁 알림을 띄우는 데 사용하는 작은 Bash 스크립트가 있습니다.스크립트를 사용하여 암호를 저장하는 가장 좋은 방법은 무엇입니까?

나는 이 스크립트를 gitrepo에 커밋하여 gitHub에서 사용할 수 있게 하고 싶지만, 이것을 하는 동안 내 로그인/비밀번호를 비공개로 유지하는 가장 좋은 방법이 무엇인지 궁금합니다.현재 암호는 스크립트 자체에 저장되어 있습니다.모든 이전 커밋에 암호가 포함되어 있기 때문에 푸시하기 직전에 제거할 수 없습니다.비밀번호 없이 개발하는 것은 선택사항이 아닙니다.외부 구성 파일에 암호를 저장해야 한다고 생각하지만, 이를 처리할 수 있는 확립된 방법이 있는지 확인한 후에 무언가를 조립해야겠다고 생각했습니다.

일반적인 방법은 구성 파일에서 암호 정보를 읽는 것입니다.이 구성파호경우인 foobar.config그러면 당신은 다음과 같은 파일을 커밋할 것입니다.foobar.config.example샘플 데이터가 들어 있는 저장소로 이동합니다.▁(▁▁local,▁to▁a)다▁you만▁tracked▁create듭not니라는 로컬(되지 않은) 파일을 만듭니다.foobar.config당신의 실제 비밀번호 데이터로.

이전 커밋에서 기존 암호를 필터링하려면 중요한 데이터 제거의 GitHub 도움말 페이지를 참조하십시오.

환경 변수를 사용하여 암호(또는 API 키)를 설정하는 방법이 있습니다.따라서 이 암호는 수정 버전 관리 범위를 벗어납니다.

Bash를 사용하면 다음을 사용하여 환경 변수를 설정할 수 있습니다.

export your_env_variable='your_password'

이 접근 방식은 Travis와 같은 지속적인 통합 서비스에서 사용할 수 있으며, GitHub 저장소에 저장된 코드(암호 없음)는 Travis가 실행할 수 있습니다(환경 변수를 사용하여 암호를 설정함).

Bash를 사용하면 다음을 사용하여 환경 변수의 값을 얻을 수 있습니다.

echo "$your_env_variable"

Python을 사용하면 다음을 사용하여 환경 변수의 값을 얻을 수 있습니다.

import os
print(os.environ['your_env_variable'])

PS: 약간 위험할 수 있습니다(하지만 꽤 일반적인 관행입니다). https://www.bleepingcomputer.com/news/security/javascript-packages-caught-stealing-environment-variables/

이 PS2: 이것dev.to"API 키를 안전하게 저장하는 방법"이라는 제목의 기사는 흥미로울 수 있습니다.

그렉이 한 은 파일을 확인하는 것이 좋은 생각이라는 것을 덧붙이고 싶습니다.foobar.config-TEMPLATE.

예제 이름, 암호 또는 기타 구성 정보를 포함해야 합니다. 실제 .config에 를 찾을 필요 없이 real foobar포함되어야 합니다.foobar.config그리고 그들이 어떤 형식을 가져야 하는지.

데이터베이스 연결 문자열 등과 같이 구성 값이 명확하지 않을 수도 있습니다.

리포지토리에서 암호를 처리하는 방법은 정확한 문제가 무엇인지에 따라 서로 다른 방식으로 처리됩니다.

하지 마세요.

그리고 이를 방지하는 방법은 .gitignore, config.example 등의 일부 응답에서 다룹니다.

  • .gitignore: Git가 아닌 서버 등에 저장(취약 솔루션)
  • 환경 변수: https://stackoverflow.com/a/30664318/3070485
  • 구성.예: https://stackoverflow.com/a/2397905/3070485
  • 명령줄 매개 변수: 프로그램 시작 시 수동으로 암호 입력

또는 2. 권한이 있는 사람만 저장소에 액세스할 수 있도록 합니다.

비밀번호를 알 수. chmod또한 저장소 또는 서버를 외부로 호스팅하는 경우 Github 또는 AWS 직원이 볼 수 있도록 허용해야 하는 문제와 같은 문제가 있습니다.

또는 3. 중요한 데이터를 암호화합니다(본 회신의 목적).

암호와 같은 중요한 정보가 포함된 구성 파일을 공용 위치에 저장하려면 암호화해야 합니다.저장소에서 복구할 때 파일의 암호를 해독하거나 암호화된 형식에서 직접 사용할 수도 있습니다.

암호화된 구성 데이터를 사용하는 Javascript 솔루션의 예는 다음과 같습니다.

const fs = require('fs');
const NodeRSA = require('node-rsa');

let privatekey = new NodeRSA();
privatekey.importKey(fs.readFileSync('private.key', 'utf8'));
const config = privatekey.decrypt(fs.readFileSync('config.RSA', 'utf8'), 'json');

console.log('decrypted: ', config);

암호 해독된 구성 파일

따라서 몇 줄의 Javascript만 기록한 암호화된 구성 파일을 복구할 수 있습니다.

로 파일을 합니다.config.RSAGit 저장소로 전환하면 효과적으로 이진 파일이 되므로 Git와 같은 기능의 이점을 많이 잃게 됩니다. 예를 들어 변경 사항을 선별할 수 있는 기능이 사라집니다.

이에 대한 솔루션은 키 값 쌍을 암호화하거나 값만 암호화하는 것일 수 있습니다.예를 들어 중요한 정보에 대한 별도의 파일이 있는 경우 모든 값을 암호화하거나, 한 파일에 모든 값이 있는 경우 중요한 값만 암호화할 수 있습니다.(아래 참조)

된 구성 .config.RSA.

여기에 RSA 키와 재생할 구성 파일을 생성하기 위해 추가된 코드 줄이 있습니다.

const fs = require('fs');
const NodeRSA = require('node-rsa');

/////////////////////////////
// Generate some keys for testing
/////////////////////////////

const examplekey = new NodeRSA({b: 2048});

fs.writeFileSync('private.key', examplekey.exportKey('pkcs8-private'));
fs.writeFileSync('public.key', examplekey.exportKey('pkcs8-public'));

/////////////////////////////
// Do this on the Machine creating the config file
/////////////////////////////

const configToStore = {Goodbye: 'Cruel world'};

let publickey = new NodeRSA();
publickey.importKey(fs.readFileSync('public.key', 'utf8'));

fs.writeFileSync('config.RSA', publickey.encrypt(configToStore, 'base64'), 'utf8');

/////////////////////////////
// Do this on the Machine consuming the config file
/////////////////////////////

let privatekey = new NodeRSA();
privatekey.importKey(fs.readFileSync('private.key', 'utf8'));

const config = privatekey.decrypt(fs.readFileSync('config.RSA', 'utf8'), 'json');
console.log('decrypted: ', config);

값만 암호화

fs.writeFileSync('config.RSA', JSON.stringify(config,null,2), 'utf8');

여기에 이미지 설명 입력

다음과 같은 방법을 사용하여 암호화된 값으로 구성 파일의 암호를 해독할 수 있습니다.

const savedconfig = JSON.parse(fs.readFileSync('config.RSA', 'utf8'));
let config = {...savedconfig};
Object.keys(savedconfig).forEach(key => {
    config[key] = privatekey.decrypt(savedconfig[key], 'utf8');
});

의 줄 각구성항별예줄에 표시의도을목예표▁(▁a:▁each()에 표시합니다.Hello그리고.Goodbye위), Git는 파일에서 무슨 일이 일어나고 있는지 더 잘 인식하고 정보 항목의 변경 사항을 완전한 파일이 아닌 차이로 저장합니다.Git는 또한 병합과 체리 픽 등을 더 잘 관리할 수 있을 것입니다.

그러나 중요한 정보에 대한 제어 변경사항을 버전화하려면 암호화된 정보(3) 솔루션에서 벗어나 안전한 저장소 솔루션(2)으로 이동해야 합니다.

토큰, 암호, 인증서, API 키 등에 대한 액세스를 보호, 저장 및 제어하는 HashiCorp Vault를 사용할 수 있습니다.

Ansible은 특히 유휴 비밀을 암호화하기 위한 "Vault" 기능(HashiCorp 제품과 관련 없음)을 갖추고 있습니다.

제가 사용하는 기술은 다음과 같습니다.

는 홈 과 같은..config

이 폴더에 암호와 키를 외부에 저장할 구성 파일을 저장합니다.

일반적으로 다음과 같은 역방향 도메인 이름 구문을 사용합니다.

com.example.databaseconfig

그런 다음 bash 스크립트에서 다음 작업을 수행합니다.

#!/bin/bash
source $HOME/.config/com.example.databaseconfig ||exit 1

|| exit 1스크립트가 구성 파일을 로드할 수 없는 경우 스크립트가 종료됩니다.

저는 그 기술을 bash, python, 개미 스크립트에 사용했습니다.

저는 꽤 편집증적이고 .gitignore 파일이 부주의한 체크인을 방지할 만큼 충분히 강력하다고 생각하지 않습니다.또한, 이를 모니터링하는 기능이 없으므로 체크인이 발생하더라도 아무도 이를 처리할 방법을 찾지 못할 것입니다.

특정 응용프로그램에 두 개 이상의 파일이 필요한 경우 단일 파일이 아닌 하위 폴더를 만듭니다.

루비를 레일에 사용하고 있다면 피가로 보석은 매우 좋고, 쉽고, 신뢰할 수 있습니다.생산 환경에서도 두통 요인이 적습니다.

신뢰하지만 확인합니다.

.gitignore이렇게 하면 "보안" 디렉토리가 repo에서 제외됩니다.

secure/

하지만 저는 @Michael Potter의 편집증을 공유합니다..gitignore를 확인하기 위해 이 "보안" 디렉터리가 체크인될 경우 클랙슨을 올리는 Python 장치 테스트가 있습니다.그리고 검사를 확인하기 위해 합법적인 디렉토리도 테스트합니다.

def test_github_not_getting_credentials(self):
    safety_url = 'https://github.com/BobStein/fliki/tree/master/static'
    danger_url = 'https://github.com/BobStein/fliki/tree/master/secure'

    self.assertEqual(200, urllib.request.urlopen(safety_url).status)

    with self.assertRaises(urllib.error.HTTPError):
        urllib.request.urlopen(danger_url)

github에게 다른 이름으로 파일을 추적하라고 할 가능성이 있습니까?예: 로컬에 파일이 있습니다.passwords.config실제 암호와 함께.sample-passwords.config그루터기로하지만, 공적인 평판에서, 저는 오직.passwords.config의 내용으로sample-passwords.config현실의passwords.config무시된알고있어요.gitignore그것은 나를 숨길 수 있습니다.passwords.config하지만 이름을 바꿀 수 있는 해결책이 있는지 모르겠습니다.sample-passwords.config원격 공공 레포에 전념하는 동안.물론, 나는 내 로컬 레포가 이름이 바뀐 파일을 추적하는 상황을 피하고 싶습니다.git status.

언급URL : https://stackoverflow.com/questions/2397822/what-is-the-best-practice-for-dealing-with-passwords-in-git-repositories

반응형