우리 팀에서는 일부 개인 키를 공유하고 이를 저장해야 합니다.통과저장소.
따라서 키를 추출하여 파일 시스템에 일반 텍스트로 저장하는 대신, 해독된 버전만 메모리에 잠시 보관하는 방법을 찾고 있습니다.
$ 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/63
63
- 이는
/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를 사용할 수 없는 경우:
임시 FIFO를 생성합니다. 이 작업 은
mktemp
직접 수행할 수 없습니다. 안전한 접근 방식은 임시 개인 계정을 만드는 것입니다.목차그럼mkfifo
안으로.FIFO 자체의 권한이 좁은지 확인하세요. 그렇지 않으면
ssh
오류가 보고됩니다.달리기
sftp -i "/temp_dir/the_fifo" user@host
병렬로 실행합니다
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
대화식으로 사용하지 않는 한 해당 도구에 전혀 익숙하지 않습니다).마지막으로 fifo와 디렉토리를 삭제하십시오.
그럼에도 불구하고 사용자(또는 루트)에서 실행되는 악성 프로세스는 여전히 ssh
FIFO에서 데이터를 먼저 읽을 수 있습니다.