[흐으으음🤔]
nodejs에서는 DB 접속 정보나, 기타 민감 정보 등의 credentials를 어떻게 관리하는 것이 좋을까? 여러가지 좋은 방식들이나 아이디어 들이 있겠지만, 여기서는 '대칭키 알고리즘 + 깃허브 액션 > 시크릿'을 활용해서 CI/CD 환경에 까지 셋팅하는 아이디어 정도를 공유해보고자 한다.
[컨셉]
가장 대표적인 DB Password를 예시로 들어보자.
1. DB 패스워드를 얻었음 ✨ (From, DBA or DevOps or 직접 생성)
2. 보안상 env등 환경 변수 파일에 직접 등록하거나 코드 상에 하드 코딩 할 수는 없으니 고민
3. 나랑 From 말고는 모르게 관리하는 방법 없을까? (+ 팀원도 모르고 키 관리자만 알고 있어야함)
*여기 부터가 진짜ㅎㅎ!@
4. 대칭키로 암호화 (대칭키는 하나의 키로 암복호화가 가능한 암호화 알고리즘)
import crypto from 'crypto';
// 대칭키 생성
const algorithm = 'aes-256-cbc'; // 대칭키 알고리즘
const key = crypto.randomBytes(32); // 32바이트(256비트)의 랜덤 대칭키 생성
const iv = crypto.randomBytes(16); // 초기화 벡터 생성
// 원본 데이터
const originalText = 'DBPASSWORD임~';
// 데이터 암호화
const cipher = crypto.createCipheriv(algorithm, key, iv);
let encryptedData = cipher.update(originalText, 'utf8', 'hex');
encryptedData += cipher.final('hex');
// 데이터 복호화
const decipher = crypto.createDecipheriv(algorithm, key, iv);
let decryptedData = decipher.update(encryptedData, 'hex', 'utf8');
decryptedData += decipher.final('utf8');
// 결과 출력
console.log('원본 데이터:', originalText);
console.log('암호화된 데이터:', encryptedData);
console.log('대칭키 (KEY):', key.toString('base64'));
console.log('초기화 벡터 (IV):', iv.toString('base64'));
5. 대칭키와, IV 값을 'Github Actions > Secrets' 에 등록

6. 'Github Actions' 에서 nodejs 환경 변수로 등록 (on .yml)
- name: Using Gihub Secrets
id: test
env:
DB_PASSWORD_KEY: ${{ secrets.DB_PASSWORD_KEY }}
DB_PASSWORD_IV: ${{ secrets.DB_PASSWORD_IV }}
7. 애플리케이션 내에서, 아래와 같이 함수화하고 환경변수를 로드하는 방식으로 DB Connector등에 평가하여 사용하면 되겠다~!
export const decrypt = (encryptedData: string, key: string, iv: string) => {
const algorithm = 'aes-256-cbc';
const decipher = crypto.createDecipheriv(
algorithm,
Buffer.from(key, 'base64'),
Buffer.from(iv, 'base64'),
);
let decryptedData = decipher.update(encryptedData, 'hex', 'utf8');
decryptedData += decipher.final('utf8');
return decryptedData;
};
decrypt(
process.env.DB_PASSWORD,
process.env.DB_PASSWORD_KEY,
process.env.DB_PASSWORD_IV,
);
[결론]
사실 해당 방식으로 하더라도 보안 누수점이 존재하기는 한다. 하지만 디플로이 권한이나 실행자 등에 대한 로깅만 잘 되어있다면 추적은 가능할 것이다. 다만 작은 규모의 서비스에서는 해당 방식 정도만 구성 해놓아도 충분히 보안 점수를 높일 수 는 있지 않을까 싶다. 결국 본질은 정보의 의 민감도 및 중요도를 잘 파악하여 적절한 보안을 갖추는 것이 중요함. (AWS Parameter Store 나 비밀키 관리 매니저 등의 서비스를 활용해도 좋음👍!!)