환경 변수와 보안

이 글은 리눅스의 환경 변수에 대해 설명하고, 환경 변수가 얼마나 안전한지 다룬다.


1. 환경 변수의 종류

출처: howtolamp, digitalocean

환경 변수란 String Key-Value 쌍으로, 두 종류가 있다. Local Env와 Global Env가 있는데, Local Env는 셸에서 사용되는 변수를 의미하고, Global Env는 흔히 말하는 환경 변수를 의미한다.

2. 환경 변수의 조회와 변경

Local Env는 set 명령으로 조회할 수 있고, 환경 변수는 env 명령으로 조회할 수 있다.

Local Env를 set로 조회하는 경우, 셸 변수, 환경 변수, 로컬 변수, 셸 함수가 출력된다.

Local Env는 {KEY}={VALUE} 형태로 등록할 수 있으며, set | grep {KEY}= 으로 반영됐는지 확인해볼 수도 있다. 단 이런 방식으로 등록한 경우 printenv | grep {KEY}로 확인하면 등록되지 않음을 확인할 수 있다.

printenv는 환경 변수 출력 면에서 env와 같다. 자세한 내용은 stackoverflow 참고

등록된 Local Env는 셸에서 ${KEY}로 참조할 수 있다. 즉, echo ${KEY}로 출력할 수 있다.

Global Env를 등록하려면 export {KEY}={VALUE}를 사용한다.

3. Local Env의 범위

Local Env는 현재 셸 프로세스 및 자식 프로세스 범위에서만 존재한다. 즉, 새로운 터미널 등에서 실행한 셸 프로세스에서 echo ${KEY}를 수행하면 아무것도 나오지 않음을 확인할 수 있다.

4. Global Env의 범위

Global Env의 경우 모든 프로세스에서 접근이 가능하다.

5. Process 별 Env

/proc/{pid}/environ로 프로세스에서 사용되는 환경 변수를 조회할 수 있다. 이 경우 프로세스에 접근할 수 있는 권한이 필요하다.

정확히 무슨 권한이 필요한지는 더 공부가 필요하다.

6. 환경변수의 안전성(secureness)

출처: stackoverflow

환경 변수에 중요 정보를 저장하는 것은 안전하지 않다. 보통 환경 변수가 사용되는 경우는 Credential을 배포할 때인데, 패스워드 등을 저장한 파일과 비교했을 때 더 안전하지는 않다고 한다.

그럼에도 환경 변수를 쓰는 이유가 뭘까?

As mentioned before, both methods do not provide any layer of additional “security” once your system is compromised. I believe that one of the strongest reasons to favor environment variables is version control: I’ve seen way too many database configurations etc. being accidentially stored in the version control system like GIT for every other developer to see (and whoops! it happened to me as well …).

Not storing your passwords in files makes it impossible for them to be stored in the version control system.

즉, Git 등으로 관리하면 실수할 여지가 크기 때문에 환경 변수를 사용한다고 한다.

배포 측면에선 환경 변수가 편리하지만 둘 다 안 좋은 방법이다.

a library author could email stack traces plus the ENV variables to themselves for debugging

즉 라이브러리 등에서도 모두 접근이 가능하기 때문에 (ex: NodeJs의 경우 process.env) 디버깅 혹은 스택 트레이스가 서버로 전송될 수도 있어서, 이런 경우 훨씬 위험할 수 있다.


7. 환경변수는 안전한가?

그렇지 않다.

Author

Seongbin Kim

Posted on

21-07-17

Updated on

21-07-17

Licensed under

댓글