Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

환경 변수 보안

이전 기사인 The Rubyist's Guide To Environment Variables에서 환경 변수 시스템이 어떻게 작동하는지 보여주고 몇 가지 일반적인 통념을 깨뜨렸습니다. 그러나 한 유용한 독자가 지적했듯이 우리는 보안에 대해 별로 말하지 않았습니다.

보안 API 키 및 기타 중요한 정보를 저장하기 위해 env vars를 사용하는 것이 일반적이 되었기 때문에 보안 영향을 이해하는 것이 중요합니다. 살펴보겠습니다:

최악의 시나리오

해커가 루트 또는 웹 응용 프로그램을 소유한 사용자로 서버에 액세스했다고 상상해 보십시오. 이 경우 고도로 암호화되지 않은 다른 모든 것과 함께 환경 변수가 손상됩니다.

여기서 해결책은 사람들이 서버에 대한 루트 액세스 권한을 얻지 못하도록 하는 것입니다. :)

트로이 목마

부두 골목에서 만난 어떤 남자가 당신에게 특별한 이미지 매직 버전을 주었습니다. 그는 그것이 스톡 imagemagick보다 두 배 빠르게 실행될 것이라고 주장합니다.

...그래서 당신은 누구든지 할 일을 합니다. 프로덕션에서 설치합니다. 유일한 문제는 환경 변수를 훔치도록 설계되었다는 것입니다.

여기에서는 역따옴표 구문을 사용하여 Ruby에서 "악의적인" mogrify 명령을 실행하고 있습니다. 그런 다음 Mogrify는 내 환경 변수를 훔치고 조롱 메시지를 인쇄합니다.

환경 변수 보안 환경 변수는 상위 프로세스(irb)에서 하위 프로세스(mogrify)로 복사됩니다.

이것은 실제로 "해킹"이 아닙니다. 이것이 바로 환경 변수가 작동하는 방식입니다. 상위 프로세스에서 하위 프로세스로 복사됩니다. 맬웨어를 실행하는 경우 다른 앱과 마찬가지로 환경 변수를 상속합니다.

두 가지 방법이 있습니다.

  • 누군가가 도구 체인에 악성 소프트웨어를 설치하도록 설득합니다.

  • 도구 체인의 "양호한" 부분에는 취약성이 있으며 환경 변수를 드러내기 위해 악용됩니다.

진정한 해결책은 이러한 일이 일어나지 않도록 사전에 예방하는 것입니다. 그러나 일부 ENV 훔치는 적기가 도구 체인에 들어갈 경우 피해를 제한하기 위해 취할 수 있는 예방 조치가 있습니다.

환경 소독

imagemagick 또는 다른 프로그램을 실행하기 위해 Ruby에서 셸을 사용할 때마다 해당 프로그램은 앱의 ENV 복사본을 상속합니다. ENV에 비밀이 있으면 그 비밀도 알게 됩니다. 벗겨내지 않는 한.

시스템 메서드에 해시를 전달하여 새 프로세스를 생성할 때 특정 환경 변수를 재정의할 수 있습니다.

환경 변수 보안 사용자 지정 환경 변수를 Ruby의 시스템 메서드에 전달하는 방법

쉘 아웃할 때 환경 변수 전송을 중지하려면 아래 예와 같이 할 수 있습니다. 여기에서 모든 값이 nil로 설정되었다는 점을 제외하고 ENV를 미러링하는 해시를 만듭니다. 아름답지는 않지만 쉘 명령을 실행할 때 모든 환경 변수를 제거하는 유일한 방법입니다.

환경 변수 보안 ruby에서 셸 명령을 실행할 때 환경 변수 전송을 중지하는 방법

목욕물과 함께 아기를 버리지 마십시오

상속은 ENV 변수의 가장 유용한 기능 중 하나입니다.

S3에 쓰는 명령을 실행해야 한다고 가정합니다. 환경 변수 상속은 명령이 Ruby 앱의 API 키를 원활하게 공유할 수 있음을 의미합니다. 상속을 허용하지 않으면 해당 능력을 잃게 됩니다.

지속성

모든 프로세스에는 프로세스가 종료될 때 종료되는 고유한 환경 변수 세트가 있습니다. Ruby 앱에서 환경 변수를 설정할 수 있지만 해당 앱이 종료되는 즉시 사라집니다.

재부팅 후 환경 변수를 유지해야 하는 경우 어딘가에 저장해야 합니다. 일반적으로 파일 시스템의 어딘가에 있습니다.

앱의 자식 저장소를 사용하지 마세요

github의 사람들이 우리만큼 정직하다고 확신합니다. 하지만 소스 코드에 액세스할 수 있는 모든 사람이 API 키를 얻고 $10,000 AWS 청구서를 실행할 수 있기를 정말로 원하십니까?

비밀에 .bashrc 또는 .bash-profile을 사용하지 마세요.

.bashrc와 같은 파일에 비밀을 저장하면 해당 사용자로 실행하는 모든 단일 프로그램에 환경 변수로 전송됩니다. 이러한 프로그램의 대부분은 사용자의 비밀을 알 필요가 없습니다. 그렇다면 왜 그들에게 제공합니까?

비밀을 필요한 프로세스에만 공개

Rails 앱이 HONEYBADGER_API_KEY를 알아야 하는 유일한 프로세스인 경우 해당 프로세스에서만 사용할 수 있도록 하는 것이 좋습니다.

Rails가 시작될 때 로드되는 파일에 환경 변수를 추가할 수 있는 몇 가지 gem이 있습니다. 이러한 환경 변수는 Rails 프로세스와 그 하위 프로세스에서만 사용할 수 있습니다. Rubyist 환경 변수 가이드 하단에 figaro 및 dotenv gem 섹션이 있습니다.

구성 파일 보안

구성 파일에서 환경을 로드하는 경우 웹 앱을 실행하는 사용자만 읽을 수 있도록 권한이 설정되어 있는지 확인해야 합니다.

여기서는 구성 파일을 만든 사용자만 읽고 쓸 수 있도록 설정합니다. 이 경우 내 Rails 애플리케이션을 소유한 동일한 사용자입니다.

환경 변수 보안 구성 파일을 읽어야 하는 사용자만 읽을 수 있도록 설정

github에 체크인하지 않기 때문에 서버에 SSH로 연결하고 수동으로 편집하거나 Chef와 같은 도구를 사용하여 관리해야 합니다.

가능한 경우 "방화벽" 구축

AWS의 정말 좋은 점 중 하나는 매우 세분화된 액세스 제어 정책을 생성할 수 있다는 것입니다. 많은 서비스 제공업체에 이와 같은 기능이 있습니다.

그게 무슨 뜻이야? 이는 누구든지 S3의 단일 버킷에 업로드할 수 있는 API 키 세트를 하나만 가질 수 있음을 의미합니다. 별도의 활동에 대해 별도의 키 쌍을 만들어야 합니다. 이미지 업로드를 위한 하나의 키 쌍. 데이터베이스 백업을 위한 또 다른 것. 등등.

이러한 방식으로 운영하면 보안 위반으로 인한 피해를 제한할 수 있습니다.