bash 프로세스를 사용하여 sftp 개인 키 파일을 바꾸는 방법은 무엇입니까?

bash 프로세스를 사용하여 sftp 개인 키 파일을 바꾸는 방법은 무엇입니까?

우리 팀에서는 일부 개인 키를 공유하고 이를 저장해야 합니다.통과저장소.

따라서 키를 추출하여 파일 시스템에 일반 텍스트로 저장하는 대신, 해독된 버전만 메모리에 잠시 보관하는 방법을 찾고 있습니다.

$ sftp -i <(pass foo) user@host
Warning: Identity file /dev/fd/63 not accessible: No such file or directory.

sftp가 왜 임시 파일 설명자를 읽을 수 없는지 아시나요? 어떻게 고치나요?

답변1

sftp임시 파일 설명자를 읽을 수 없는 이유가 무엇인지 아시나요 ?

몇 가지 사실:

  • 프로세스 <(pass foo)대체로 인해 bash파이프가 생성되고, 명령이 비동기적으로 실행되며, 해당 출력이 파이프의 쓰기 끝 부분에 연결되고, 파이프의 읽기 끝 부분을 참조하는 파일 설명자가 있는 형식 의 경로로 pass foo대체됩니다 .<(...)/dev/fd/6363
  • 이는 /dev/fd/63프로세스가 stat()해당 파일 설명자 중 하나에서 참조하는 파일을 다시 열 수 있도록 하는 특수 경로입니다.
  • 쉘은 + execs를 분기 sftp한 다음 sftp자체적으로 분기 및 execs를 ssh수행하여 63파일 설명자가 상속을 통해 전달됩니다.
  • ssh~ 할 것이다모든 파일 설명자를 닫습니다.이 기능을 사용하면 0, 1, 2를 제외합니다 closefrom(). fd 도 닫힙니다 63.

63더 이상 프로세스의 열린 파일 설명자가 아니기 ssh때문에 OP 의 오류로 인해 stat()on이 실패합니다./dev/fd/63

어떻게 고치나요?

키를 메모리 내 파일 시스템에 임시 저장합니다. 내 데비안 systemd에서 tmpfs를 제공했습니다./run/user/<myUID>. 마운트 지점은 나(물론 루트 포함) 외에는 누구도 액세스할 수 없습니다.

이 파일은 사용자(또는 루트)에서 실행 중인 악성 프로세스에서 읽을 수 있습니다. 그러나 이러한 프로세스는 sshd원래 방법으로 파일 설명자에서 읽을 수도 있습니다.63

또는 보안 tmpfs를 사용할 수 없는 경우:

  1. 임시 FIFO를 생성합니다. 이 작업 은 mktemp직접 수행할 수 없습니다. 안전한 접근 방식은 임시 개인 계정을 만드는 것입니다.목차그럼 mkfifo안으로.

  2. FIFO 자체의 권한이 좁은지 확인하세요. 그렇지 않으면 ssh오류가 보고됩니다.

  3. 달리기

    sftp -i "/temp_dir/the_fifo" user@host
    
  4. 병렬로 실행합니다 pass foo > "/temp_dir/the_fifo". 한 가지 특이한 점: 해야 할 일두 배; 내 데비안에서 키를 최소한 두 번 읽으세요 ssh. 내 테스트에서는 다음 명령이 작동하는 것 같습니다. cat ~/.ssh/id_rsa > "/temp_dir/the_fifo" && cat ~/.ssh/id_rsa > "/temp_dir/the_fifo". 비슷한 반복 명령이 도움이 될 수도 있습니다.

    pass foo > "/temp_dir/the_fifo" && pass foo > "/temp_dir/the_fifo"
    

    이전에 백그라운드에서 실행할 수 있습니다 sftp( pass대화식으로 사용하지 않는 한 해당 도구에 전혀 익숙하지 않습니다).

  5. 마지막으로 fifo와 디렉토리를 삭제하십시오.

그럼에도 불구하고 사용자(또는 루트)에서 실행되는 악성 프로세스는 여전히 sshFIFO에서 데이터를 먼저 읽을 수 있습니다.

관련 정보