자동매매 시스템의 핵심 요소는 데이터베이스 연결과 API 키입니다. 이 정보들은 시스템의 작동에 필수적입니다. 하지만 동시에 외부에 노출될 경우 심각한 보안 문제를 야기할 수 있습니다. 데이터베이스 정보가 유출되면 자산 손실로 이어질 수 있습니다. API 키가 노출되면 무단 거래가 발생할 수 있습니다.
따라서 데이터베이스 연결 정보와 API 키를 안전하게 관리하는 것은 매우 중요합니다. 이 섹션에서는 Oracle Cloud 환경에서 데이터베이스 연결과 API 키를 보호하는 방법을 안내합니다. 안전한 환경 변수 설정, 암호화, 접근 제어 등을 통해 보안을 강화합니다.
단계 1: 환경 변수 설정 및 관리
API 키와 데이터베이스 연결 정보는 코드에 직접 포함시키지 마세요. 환경 변수를 사용하여 관리하는 것이 안전합니다. 환경 변수는 시스템 운영체제 수준에서 설정됩니다. 코드 변경 없이 설정을 변경할 수 있습니다.
1. OCI Compute 인스턴스 접속:
PuTTY 또는 다른 SSH 클라이언트를 사용하여 OCI Compute 인스턴스에 접속합니다.
2. .bashrc 파일 수정:
.bashrc
파일을 열어 환경 변수를 설정합니다.
vi ~/.bashrc
3. 환경 변수 추가:
파일 하단에 API 키와 데이터베이스 연결 정보를 추가합니다. 실제 값은 숨겨지도록 처리합니다.
export UPBIT_ACCESS_KEY="YOUR_UPBIT_ACCESS_KEY"
export UPBIT_SECRET_KEY="YOUR_UPBIT_SECRET_KEY"
export ADB_USERNAME="YOUR_ADB_USERNAME"
export ADB_PASSWORD="YOUR_ADB_PASSWORD"
export ADB_WALLET_PATH="YOUR_ADB_WALLET_PATH"
4. 변경 사항 적용:
파일을 저장하고 닫은 후, 다음 명령어를 실행하여 변경 사항을 적용합니다.
source ~/.bashrc
5. 코드에서 환경 변수 사용:
파이썬 코드에서 os
모듈을 사용하여 환경 변수를 읽어옵니다.
import os
upbit_access_key = os.environ.get("UPBIT_ACCESS_KEY")
upbit_secret_key = os.environ.get("UPBIT_SECRET_KEY")
adb_username = os.environ.get("ADB_USERNAME")
adb_password = os.environ.get("ADB_PASSWORD")
adb_wallet_path = os.environ.get("ADB_WALLET_PATH")
print(f"Upbit Access Key: {upbit_access_key}") # 실제 키 값이 출력되는지 확인
단계 2: Oracle Wallet 보안 설정
Oracle Autonomous Database (ADB) 연결에 사용되는 Wallet 파일은 중요합니다. Wallet 파일은 데이터베이스 연결 정보를 포함합니다. Wallet 파일 자체를 안전하게 관리해야 합니다.
1. Wallet 파일 접근 제한:
Wallet 파일에 대한 접근 권한을 제한합니다. 자동매매 시스템을 실행하는 사용자만 접근할 수 있도록 설정합니다.
chmod 400 <wallet_파일_경로>
chmod 400
명령어는 파일 소유자만 읽기 권한을 가지도록 설정합니다.
2. Wallet 파일 암호화:
Wallet 파일을 암호화하여 저장하는 것을 고려합니다. openssl
등의 도구를 사용하여 암호화할 수 있습니다. 암호화 키는 안전한 곳에 보관해야 합니다.
3. Wallet 파일 위치 숨김:
Wallet 파일의 위치를 숨깁니다. 시스템의 일반적인 경로에 Wallet 파일을 저장하지 않습니다. 숨겨진 디렉토리에 저장하거나, 파일 이름을 변경하여 쉽게 찾을 수 없도록 합니다.
단계 3: 코드 저장소 보안 강화
자동매매 시스템 코드를 저장하는 Git 저장소의 보안을 강화합니다. 공개 저장소에 API 키나 데이터베이스 연결 정보를 절대 업로드하지 마세요.
1. 비공개 저장소 사용:
Git 저장소를 비공개(Private)로 설정합니다. 허가된 사용자만 저장소에 접근할 수 있도록 합니다.
2. .gitignore 파일 활용:
.gitignore
파일을 사용하여 API 키나 데이터베이스 연결 정보가 포함된 파일을 저장소에 업로드하지 않도록 설정합니다.
# .gitignore 파일 내용 예시
*.log
secrets.py
config.ini
3. 코드 리뷰:
코드를 저장소에 커밋하기 전에 반드시 코드 리뷰를 수행합니다. API 키나 데이터베이스 연결 정보가 코드에 포함되어 있는지 확인합니다.
단계 4: OCI IAM 정책 설정
OCI Identity and Access Management (IAM) 정책을 사용하여 접근 권한을 제어합니다. 자동매매 시스템이 필요한 리소스에만 접근할 수 있도록 권한을 제한합니다.
1. 최소 권한 원칙 적용:
자동매매 시스템에 필요한 최소한의 권한만 부여합니다. 불필요한 권한은 제거합니다.
2. 사용자 정의 정책 생성:
자동매매 시스템에 특화된 사용자 정의 정책을 생성합니다. 정책을 통해 Compute 인스턴스, Autonomous Database 등 필요한 OCI 리소스에 대한 접근 권한을 설정합니다.
3. 그룹 활용:
사용자를 그룹으로 묶어 권한을 관리합니다. 그룹에 정책을 적용하면 그룹 내 모든 사용자에게 동일한 권한이 부여됩니다.
단계 5: 데이터베이스 접근 제어
Oracle Autonomous Database에 대한 접근을 제어합니다. 허용된 IP 주소에서만 데이터베이스에 접근할 수 있도록 설정합니다.
1. 네트워크 접근 제어 목록 (ACL) 설정:
Autonomous Database의 네트워크 ACL을 설정합니다. 자동매매 시스템이 실행되는 OCI Compute 인스턴스의 공용 IP 주소만 허용합니다.
2. 데이터베이스 사용자 권한 제한:
데이터베이스 사용자의 권한을 제한합니다. 자동매매 시스템에 필요한 최소한의 권한만 부여합니다. 불필요한 테이블이나 뷰에 대한 접근을 차단합니다.
단계 6: 정기적인 보안 점검
자동매매 시스템의 보안 상태를 정기적으로 점검합니다. 시스템 설정, 코드, 접근 권한 등을 확인합니다. 보안 취약점을 발견하면 즉시 조치합니다.
1. 보안 업데이트:
운영체제, 파이썬 라이브러리 등 시스템에 설치된 모든 소프트웨어를 최신 버전으로 유지합니다. 보안 업데이트는 알려진 취약점을 해결합니다.
2. 코드 분석 도구 활용:
정적 코드 분석 도구를 사용하여 코드의 보안 취약점을 검사합니다. SQL Injection, Cross-Site Scripting (XSS) 등의 취약점을 탐지합니다.
3. 침투 테스트:
모의 해킹 테스트를 수행하여 시스템의 보안 취약점을 실제로 공격해봅니다. 발견된 취약점을 개선하여 시스템 보안을 강화합니다.
요약:
이 섹션에서는 자동매매 시스템의 데이터베이스 연결과 API 키를 안전하게 관리하는 방법을 설명했습니다. 환경 변수 설정, Oracle Wallet 보안 설정, 코드 저장소 보안 강화, OCI IAM 정책 설정, 데이터베이스 접근 제어, 정기적인 보안 점검 등을 통해 시스템 보안을 강화할 수 있습니다.