쉘/Perl 스크립트에서 비밀번호를 보관하는 모범 사례는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/80612

  •  09-06-2019
  •  | 
  •  

문제

나는 최근 동료들을 돕기 위해 Perl과 쉘 스크립트 기술을 연마해야 했습니다.문제의 동료들은 대규모 Oracle 데이터베이스 백엔드가 포함된 내부 애플리케이션에서 일부 보고서를 제공하는 임무를 맡았지만 이를 수행할 기술이 없습니다.어떤 사람들은 나에게도 그러한 기술이 있는지 의문을 제기할 수 있지만(웃음), 분명히 많은 사람들은 내가 그것을 지체할 수 없다는 의미로 그렇게 생각한다고 생각합니다.

내 질문에 따르면, 데이터베이스에서 보고서를 추출하기 위해 내 스크립트는 분명히 쿼리를 연결하고 실행해야 합니다.나는 지금까지 데이터베이스의 사용자 이름과 비밀번호를 어디에 저장할 것인지에 대한 좋은 솔루션을 찾지 못했기 때문에 현재 스크립트에 일반 텍스트로 저장되고 있습니다.

다른 사람이 이미 CPAN 모듈로 작성한 좋은 솔루션이 있습니까?아니면 사용자/비밀번호 콤보를 파일 시스템의 다른 곳에 숨겨져 있는 완전히 별도의 파일에 보관하는 것과 같이 더 나은 방법이 있습니까?아니면 시스템 전체 grep을 사용하여 스크립트에서 가져오는 것을 방지하기 위해 간단하게 암호화된 상태로 유지해야 합니까?

편집하다:Oracle 데이터베이스는 HP-UX 서버에 위치합니다.
응용 프로그램 서버(셸 스크립트 실행)는 Solaris입니다.
나만 소유하도록 스크립트를 설정하는 것은 불가능합니다. 여러 지원 담당자가 액세스할 수 있는 서비스 계정이 스크립트를 소유해야 합니다.
스크립트는 cron 작업으로 실행되도록 만들어졌습니다.
공개 키 인증을 사용하고 싶지만 Oracle에서 작동하도록 하는 방법을 모르고 있습니다. 그런 방법이 있다면 알려주세요!

도움이 되었습니까?

해결책

IMHO의 모범 사례는 쉘/Perl 스크립트에 비밀번호를 보관하지 않는 것입니다.이것이 공개 키 인증의 목적입니다.

다른 팁

스크립트가 서버에서 원격으로 실행되는 경우.

  1. 보고서 보기를 만드세요
  2. 로그인 중인 사용자에게 보고서 보기에서 선택할 수 있는 액세스 권한만 부여하세요.
  3. 비밀번호를 저장해두시면 됩니다.

이렇게 하면 사용자가 할 수 있는 일은 보고서에 사용할 데이터를 선택하는 것뿐입니다.누군가가 우연히 비밀번호를 알게 되더라도 비밀번호로 할 수 있는 작업은 제한됩니다.

개인적으로 저는 애플리케이션과 독립적으로 배포되고 특정 시스템/환경에 따라 변경될 수 있는 구성 파일에 비밀번호를 보유하고 있습니다.쉘 스크립트에서는 이를 기본 스크립트 내에서 소싱할 수 있습니다.

그러나 Perl에는 다양한 접근 방식이 있습니다.조사하고 싶을 수도 있습니다 Getopt::긴 명령줄 옵션(추가로 Getopt::Argv파일 간단한 구성 파일에 저장하려면) 또는 다음과 같은 것을 살펴보십시오. 구성::Ini파일 그 뒤에 조금 더 힘이 있는 무언가를 위해.이것은 제가 일반적으로 사용하는 두 가지 유형이지만 사용 가능한 다른 구성 파일 모듈도 있습니다.

좋은 해결책은 없습니다.비밀번호를 약간 난독화할 수는 있지만 보안을 유지할 수는 없습니다.

DB 설정을 제어할 수 있는 경우 비밀번호 없이 명명된 파이프(적어도 mysql은 이를 지원함)로 연결을 시도하고 OS가 권한을 처리하도록 할 수 있습니다.

제한된 권한이 있는 파일에 자격 증명을 저장할 수도 있습니다.

ksh & bash 태그를 지정했으므로 Linux를 가정하겠습니다.

대부분의 문제는 사용자가 스크립트를 읽고 파일을 숨기거나 암호화하는 데 사용한 방법을 찾을 수 있으면 동일한 작업을 수동으로 수행할 수도 있다는 것입니다.

더 좋은 방법은 다음을 수행하는 것입니다.

  1. 귀하만 볼 수 있고, 읽고, 열 수 있도록 스크립트를 만드세요.chmod 700입니다.하드코드된 비밀번호를 사용하세요.
  2. 사용자가 실행할 수 있고 sudo 를 수행하는 "런처" 스크립트가 있어야 합니다.

이 방법으로 사용자는 실행 프로그램 스크립트를 볼 수 있고, 단일 명령줄만 있는지 검사할 수 있습니다.실행할 수 있고 작동하지만 sudo된 스크립트의 소스를 읽을 수 있는 권한이 없습니다.

현재 실행 중인 Oracle 버전이 무엇인지 잘 모르겠습니다.이전 버전의 Oracle(9i 이전 Advanced Security)에서는 일부 DBA가 CREATE USER OPS$SCOTT IDENTIFIED BY EXTERNALLY 그리고 설정 REMOTE_OS_AUTHENT 사실로.

이는 원격 Sun 머신이 사용자를 SCOTT로 인증할 수 있고 Oracle DB가 해당 인증을 수락한다는 의미입니다.

이것은 나쁜 생각입니다.

SCOTT의 로컬 사용자가 있는 Windows XP를 이미지화하면 비밀번호 없이 DB에 로그인할 수 있습니다.

불행하게도 Oracle 9i DB에서 사용자 이름/암호를 스크립트나 클라이언트 시스템이 액세스할 수 있는 다른 위치에 저장하지 않는 것이 제가 아는 유일한 옵션입니다.

귀하의 솔루션이 무엇이든 Oracle의 솔루션을 살펴보는 것은 가치가 있습니다. 프로젝트 잠금 커밋하기 전에.

비밀번호를 저장하기 위해 먼저 스크립트 자체에 하드코딩된 키를 사용하고 선택적으로 파일에 저장된 키를 사용하여 두 번째 암호화 루틴을 수행할 수 있습니다(액세스가 제한되도록 파일 권한을 사용하여 설정됨).

주어진 상황에서는 키 파일(+ 스크립트의 키)을 사용할 수 있으며, 상황 요구 사항이 그다지 크지 않은 경우 스크립트에 하드코딩된 키를 사용하여 암호화를 사용할 수 있습니다.두 경우 모두 비밀번호는 구성 파일에서 암호화됩니다.

어떻게든 일반 텍스트 비밀번호를 해독하고 얻을 수 있어야 하기 때문에 완벽한 해결책은 없습니다. 그리고 만약 당신이 그것을 할 수 있다면 올바른 정보를 가지고 있는 다른 사람도 그렇게 할 수 있습니다.

특히 우리가 그들에게 Perl 스크립트를 제공하는 상황에서는(vs.exe) 암호화(및 하드코드된 키)를 수행하는 방법을 쉽게 볼 수 있습니다. 따라서 키 파일(파일 시스템 권한으로 보호할 수 있음)을 사용하는 옵션도 허용해야 합니다.

구현 방법에 대한 몇 가지 실제 예는 다음과 같습니다. 여기

UNIX에서는 항상 이러한 스크립트를 setuid로 만들고 사용자 및 비밀번호 정보를 강력하게 보호되는 파일에 저장합니다(전체 디렉토리 트리는 일반 사용자가 읽거나 검색할 수 없으며 파일 자체는 스크립트 소유자만 읽을 수 있습니다). .

이를 간단하게 암호화된 별도의 파일에 보관하고 필요한 테이블에 대한 읽기 전용 액세스 권한이 있는 별도의 사용자를 데이터베이스에 만듭니다.파일을 읽었다고 생각되면 해당 사용자에 대한 액세스만 차단할 수 있습니다.

좀 더 자세히 알아보려면 SUID 프로그램에서 /proc//exe 및 cmdline(Linux의 경우)을 확인한 다음 사용자 이름을 해제할 수 있습니다.

저는 개발자가 Solaris 서버의 ANT를 사용하여 SQL 코드를 MSSQL(실제로 해당 MSSQL 서버의 모든 데이터베이스에 배포하므로 역할은 SysAdmin이어야 함)에 배포하는 것과 유사한 문제를 겪었습니다.다시 한번 나는 ANT build.xml 파일에 사용자 이름과 비밀번호를 저장하고 싶지 않았기 때문에 이상적이지 않은 내 솔루션은 다음과 같습니다.

  1. 일반 텍스트 파일에 사용자 이름과 비밀번호의 이름/값 쌍을 저장합니다.
  2. 파일을 암호화하고(Solaris에서) 특정 관리자에게만 알려진 암호 문구를 사용합니다.
  3. Solaris 시스템에는 암호화된 파일만 남겨두세요
  4. ANT build.xml은 sudo 해독을 실행하고 관리자가 입력한 암호 문구를 묻는 메시지를 표시합니다.
  5. ANT는 SQL 문자열의 변수로 사용자 이름과 비밀번호를 로드하는 해독된 파일을 소스로 사용합니다.
  6. ANT는 즉시 일반 텍스트 파일을 삭제했습니다.
  7. ANT가 코드를 배포하고 종료합니다.

이 모든 작업은 몇 초 안에 발생하며 SQL 사용자 이름과 비밀번호는 서버에서 눈에 띄게 액세스할 수 없습니다.프로덕션 환경에서 허용된 관리자가 코드를 배포하므로 개발자는 해당 코드를 코드에 포함할 필요가 없습니다.

분명 더 좋을 수도 있겠지만...

JB

이 스레드를 이전에 본 적이 없다는 것은 유감스러운 일입니다. 매우 흥미로울 것 같습니다.앞으로 이 스레드를 접하는 사람을 위해 2센트를 추가하겠습니다.

DB 서버 자체에서 OS 인증을 사용하는 것이 좋습니다. REMOTE_OS_AUTHENT는 여전히 FALSE입니다.

다른 컴퓨터에서 스크립트를 호출하는 경우 구문 없는 SSH 키를 설정하고 SSH를 사용하여 해당 키에 도달하세요.그런 다음 SQL 결과를 호출 시스템으로 다시 파이프하면 이 정보를 추가로 처리할 수 있습니다.

이렇게 하면 어디에서나 비밀번호를 코딩할 필요가 없습니다.물론, 악의적인 관리자가 구문 없는 키를 탈취하여 사용할 경우에는 DB 호스트의 사용자 계정에도 접근하여 OS 인증된 DB 사용자가 할 수 있는 모든 작업을 수행할 수 있습니다.이를 완화하려면 해당 OS 사용자의 데이터베이스 권한을 최소한으로 줄일 수 있습니다. "읽기 전용"이라고 가정하겠습니다.

잉고

Windows에서는 비밀번호가 일반 텍스트로 포함된 폴더와 파일을 그 안에 만듭니다.예약된 작업(스크립트 또는 배치)을 실행할 사용자를 이 폴더 및 파일에 대한 읽기/쓰기 액세스 권한이 있는 유일한 사람으로 설정합니다.(관리자도 제거).다른 모든 스크립트에는 이 제한된 파일에서 일반 텍스트 비밀번호를 읽는 코드를 추가합니다.

이것은 소수에게 충분할 것입니다.

키워드:비밀번호 하드코딩

Cyberark AIM과 같은 상용 또는 고급 솔루션이 더 잘 할 수 있지만 무료로 수행하고 기본적으로 SSH 공개/개인 키를 피기백했습니다. 왜냐하면 이미 생성된 SSH 키 쌍이 표준을 따르기 때문입니다. 보안 정책;둘째, SSH 키 쌍에는 파일 권한, 지속적인 시스템 강화(예: 트립와이어) 또는 키 순환을 통해 키를 보호하기 위한 표준 프로토콜 세트가 이미 있습니다.

이것이 내가 한 방법입니다:

  1. 아직 SSH 키 쌍을 생성하지 않았다면 생성하세요.키 쌍과 디렉터리는 기본 시스템 프로토콜/권한에 의해 보호됩니다.ssh-keygen –t rsa –b 2048

  2. SSH 공개 키를 사용하여 문자열을 암호화하고 같은 .ssh 디렉토리 $ echo "secretword"| OpenSSL RSAutl -Encrypt -inkey ~/.ssh/id_rsa.pub -pubin -out ~/.ssh/secret.dat

  3. SSH 개인 키를 사용하여 키를 해독하고 매개변수를 실시간으로 스크립트/AP에 전달합니다.실시간으로 해독할 줄을 포함하는 스크립트/프로그램:문자열=openssl rsautl -decrypt -inkey ~/.ssh/id_rsa -in ~/.ssh/secret.dat

추신 - 저는 CYBERARK AIM 에이전트 없는 솔루션을 실험해 왔습니다.API/스크립트에 대한 상당한 변경/API 변경이 필요한 일종의 고통입니다.어떻게 진행되는지 계속 알려드리겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top