“curl -u username : password http://example.com”은 안전합니까?


30

curl -u username:password http://example.com보안?

그렇지 않은 경우 다른 사람이 비밀번호를 얻는 방법에 대해 간단히 설명 할 수 있습니까?


6
터미널에서 사용하는 경우 두 자격 증명이 모두 bash 기록에 저장되어 있습니까?
Francisco Tapia

15
다른 사용자 ps -ef가 실행중인 프로세스를 보는 데 사용할 수 있으므로 이러한 명령은 안전하지 않습니다 . curl -u username:password http://example.com목록에 표시 되면 대상, 사용자 이름 및 비밀번호가 노출 된 것입니다.
Lambert

문제는 여기에 주제이지만, 당신은 또한에 관심이있을 수 있습니다 정보 보안 StackExchange
IQAndreas

답변:


54

cURL은 기본적으로 HTTP 프로토콜이 비밀번호를 일반 텍스트로 보내는 기본 인증으로 설정 되므로 안전하지 않습니다 . username:password문자열 을 지정 하면 HTTP 헤더에서 BASE64 문자열 로 변환됩니다 .

GET / HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

HTTP 트래픽을 가로 챌 수있는 사람 (제공자, 귀하와 동일한 무선 AP에 액세스하는 사람)은 온라인 BASE64 변환기 를 사용하여 비밀번호를 복구 할 수 있습니다 .

HTTPS 프로토콜은이 헤더가 전송되기 전에 암호화 된 연결을 설정하여 암호를 공개하지 못하게하여 상황을 개선합니다. 그러나 이것은 알 수없는 인증서를 확인하고 보안 예외를 승인하는 등의 요청을받을 때 사용자가주의를 기울이는 경우에만 적용됩니다.

같은 머신의 다른 사용자가 ps -ef/ proc 파일 시스템, bash 기록 및 터미널 로그에서 명령 인수를 사용할 수 있습니다 (@Lambert의 의견에 감사드립니다). 일부 플랫폼의 cURL은 비밀번호를 숨기려고 시도하므로 예를 들어 ps -ef비밀번호 대신 공백이 표시 될 수 있습니다. 그러나 cURL faq 에 설명 된대로 비밀번호를 명령 행 인수로 전달하는 대신 cURL에 직접 비밀번호를 입력하도록하는 것이 좋습니다 .


4
curl이에서 데이터를 숨기기 위해 자체 argv를 덮어 쓰는 플랫폼에 있더라도 ps해당 콘텐츠가 취약한 덮어 쓰기가 수행되기 전에 시작되는 기간이 있습니다.
Charles Duffy

다이제스트 인증은 어떻습니까? 컬은 기본적으로 사용하지 않습니까?
rr-

2
@rr 다이제스트 인증은 중간자 (man-in-the-middle) 공격을 막지 않기 때문에 조금 더 나아 지므로 HTTPS를 사용하는 것이 좋습니다.
Dmitry Grigoryev

1
@rr 대부분의 브라우저에서 StartSSL을 신뢰하지 않는 방법은 무엇입니까? 많은 Windows 95 또는 Firefox 1.5 사용자가 있습니까?
Hagen von Eitzen


24

안전하지 않습니다. 명령 줄 매개 변수는 모든 사용자가 볼 수 있습니다.


4
@Dmitry Grigoryev와 병합하면 가장 정확한 답변 일 수 있습니다.
Francisco Tapia

1
그래, 내가 인정해야 할 문제의 큰 부분을 완전히 놓쳤다.
Dmitry Grigoryev

명령은 사용자 만 읽을 수있는 스크립트의 일부일 수 있습니다.
Pete

2
스크립트 실행 또는 터미널에서 시작된 프로그램 실행의 @Pete 명령 행은 일반적으로 ps명령 및 /proc파일 시스템을 통해 모든 사용자에게 표시됩니다 . 명령이 빨리 완료되면 위험이 줄어들지 만 여전히 위험에 처해 있습니다.
RBerteig

2
@Pete 답변은 배타적이지 않으며 서로 보완됩니다. 따라서 두 번째 답변이 첫 번째에서 설명한 위협을 생략하는 것이 좋습니다. 오히려 반복하는 것이 중복됩니다. 그리고 나는 모든 경우에 사실이 아니기 때문에 그 진술을 거짓이라고 부르지 않을 것입니다.
Dmitry Grigoryev

1

--netrc-file 매개 변수를 사용하면보다 안전한 방식으로 수행 할 수 있습니다.

  1. 600 권한으로 파일 만들기

예를 들어 : vi / root / my-file

machine example.com

로그인 USERNAME

비밀번호 비밀번호

파일을 저장하고 닫습니다

  1. 아래를 사용하여 사용자 이름과 비밀번호로 URL에 액세스하십시오.

curl --netrc-file / root / my-file http://example.com

  1. 끝난

0

HTTP 체계를 사용할 때 안전하지 않습니다. 보안을 유지하려면 HTTPS를 사용해야합니다.

명령 기록에 비밀번호가 나타나지 않도록 숨기려면 사용자 이름 만 제공하십시오. 명령에 제공되지 않은 경우 컬은 암호를 묻습니다.


HTTPS를 사용할 수없는 경우 유용한 답변이 아닙니다. cURL은 "클라이언트"입니다.
mckenzm

0

짧은 대답은 아니요 ...하지만 ....

서버 측 옵션이 없으면 보안을 강화할 수 있습니다.

  1. 로컬 인트라넷 인 경우 브로드 캐스트 도메인을 분리하고 WiFi 또는 라디오를 사용하지 마십시오.
  2. Shameer가 말했듯이 .netrc 파일을 사용하고 코드에서 값을 유지하십시오.
  3. 메모리가 안전하다고 생각되면 환경 변수를 사용하십시오. $ PSWD.
  4. 이것이 자동화 인 경우 루트의 crontab에서 실행하십시오.
  5. ... 컨테이너에.
  6. ... 암호화 된 디스크가있는 VM에서.

이들 중 어느 것도 HTTP를 사용하는 브라우저보다 안전하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.