
환경변수에 대해 배우고 있어요. 예를 들어, 비밀 비밀번호가 있는 경우 이를 코드 내부에 코딩해서는 안 된다는 것을 알고 있습니다.
내가 이해한 바로는.env비밀 및 환경 변수를 로드하려면 파일을 사용해야 합니다.
변수를 저장하는 더욱 안전한 방법은 다음을 사용하여 CLI 변수로 저장하는 것입니다.세트명령.
그 이유는 귀하의 비밀번호와 민감한 데이터가 승인되지 않은 사람에게 노출되는 것을 방지하기 위함입니다.
이제 CLI 변수로 저장된 일부 API 비밀이 있는 웹 사이트를 만들고 해커가 내 서버에 액세스할 수 있다고 가정해 보겠습니다. 그는 명령을 입력하기만 하면 API 비밀과 비밀번호를 쉽게 찾을 수 있습니다.printenvCLI에서.
.env 파일에 저장하는 것보다 CLI 변수를 사용하면 어떤 이점이 있습니까? 낯선 사용자에게도 이러한 변수가 숨겨져 있는지 어떻게 확인할 수 있습니까?
답변1
변수를 저장하는 더욱 안전한 방법은 set 명령을 사용하여 CLI 변수로 저장하는 것입니다.
아니요, 그렇지 않습니다. 우선, 명령은 실제로가게그들은 어디에서나 지속됩니다. 실제 환경 변수에 대해 더 중요한 또 다른 점은 보안 저장소와 완전히 반대라는 것입니다. 전체 기능은 다음을 기반으로 합니다.모든 과정모든 환경 변수의 무료 사본 얻기 – 예를 들어 Windows에서 변수를 유지하기 위해 사용하는 경우 setx
문자 그대로 실행한 모든 앱이나 도구는 요청 여부에 관계없이 자동으로 사본을 얻습니다.
사용되는 파일을 보면 .env
일반적으로 해당 파일은 웹앱 환경에만 구체적으로 로드되거나 환경 변수로 전혀 사용되지 않습니다(익숙한 API를 모방할 뿐 실제로는 변수를 일반 딕셔너리/배열에 로드함). 전자의 경우 웹앱에서 직접 생성된 프로그램에서는 변수를 계속 사용할 수 있지만절대일반 SSH CLI에서 사용할 수 있습니다. 여전히 "환경 변수"라고 불리지만 이는 의도된 용도가 아닙니다.
(물론 앱 자체는 여전히 이에 액세스할 수 있습니다. 결국 API를 사용하려면 API 키를 알아야 하므로 이는 불가피합니다. 공격자가 방법을 찾을 가능성을 줄이려면 권장 프로그래밍 방식을 따르세요. 이를 실행하십시오 printenv
. 예를 들어 파일 이름과 같은 외부 입력을 명령에 직접 넣지 마십시오.
사용 중인 API에 따라 앱을 마이크로서비스와 같은 두 개로 분할하여 프런트엔드가 API에 직접 액세스하지 않고 항상 API 키를 알고 있는 다른 서비스를 통과하도록 할 수 있습니다. 프런트엔드가 매우 구체적인 작업만 수행하도록 허용합니다.)
답변2
비밀/비밀번호/키 관리는 얼마나 많은 노력을 들이고 싶은지와 얼마나 위험한지 균형을 맞추는 복잡한 게임입니다. 여기에 몇 가지 예가 있습니다:
- 명령줄 인수를 통해 전달된 비밀: 시스템의 모든 사용자가 볼 수 있습니다.
- text/.env 파일에서 전달된 비밀: 파일에 대한 읽기 액세스 권한이 있는 모든 사용자가 이를 훔칠 수 있습니다. CLI를 사용하는 경우세트명령은 기본적으로 명령 기록에도 표시됩니다.
- 다른 서버에서 로드된 비밀: 해당 서버에 액세스하기 위한 자격 증명은 여전히 로컬에 저장됩니다.
- 메모리에만 저장된 비밀: 루트 액세스 권한이 있는 사용자는 원시 메모리의 데이터에 액세스하고 덤프할 수 있습니다.
누군가가 귀하의 서버를 제어할 수 있다면 어쨌든 귀하의 코드를 변경하여 비밀번호를 보낼 수 있습니다(예를 들어 신용 카드 정보를 훔치는 일반적인 방법).
파일에서 비밀번호를 검색하는 것은 매우 간단하므로 기본 비밀을 일반 텍스트로 로컬에 저장하지 않는 것이 좋습니다. 그 이상은 당신에게 달려 있습니다. 보안을 향상시키는 몇 가지 적절한 방법은 다음과 같습니다.
- 로컬 비밀을 위해 일종의 암호화된 키 저장소를 사용하십시오. 실제 비밀번호에 액세스하기 위해 다른 단계를 추가하기만 하면 많은 간단한 공격을 막을 수 있습니다.
- 외부 서버/서비스를 사용하여 비밀을 저장하면 로컬 액세스 권한만 있는 사람이 모든 것을 쉽게 얻을 수 없습니다.