비대화형 ecryptfs 디렉터리 암호화/복호화

비대화형 ecryptfs 디렉터리 암호화/복호화

스크립트에서 ecryptfs Private 디렉터리를 해독할 수 있나요?

이러한 유형의 활동에 대한 나의 기본 사용 사례는 원격 백업을 수행하는 것입니다. 사진(또는 기타 민감한 정보)을 저장하는 암호화된 개인 디렉토리가 있는 머신(privatebox라고 함)이 있다고 상상해 보십시오. 로그인 시에만 암호가 해독됩니다. 원격 컴퓨터에서 privatebox에 로그인하고 디렉터리를 해독하여 사진을 추가한 다음 다시 암호화하고 로그아웃하는 스크립트를 작성할 수 있다고 상상해 보십시오. 이 모든 작업에는 사용자 상호 작용 단계가 필요하지 않습니다(크론에서 실행될 수도 있음). 개인박스의 비밀번호는 일반 텍스트나 어떠한 형태로도 개인박스에 저장되지 않습니다. 그리고 암호화되므로(업데이트 중 제외) 누군가 SD 카드 등을 입수해도 보호됩니다.

이러한 스크립트는 다음과 같이 작동합니다(제 생각에는):

  • privatebox에 비밀번호로 암호화된 개인 디렉터리 설정
  • SSH를 비대화식으로 사용할 수 있도록 로컬 컴퓨터에서 privatebox로 SSH 키를 설정하세요(cron은 로그인 가능)
  • 그리고 뭐? 비밀번호를 알고 있는 경우 개인 폴더를 비대화식으로 해독하는 방법은 무엇입니까?

ecryptfs는 이를 허용하지 않도록 특별히 설계된 것 같습니다(SSH 키 스푸핑을 사용하더라도 여전히 개인 디렉터리를 수동으로 마운트해야 합니다).

기본적으로 내가 찾고 있는 것은 "ecryptfs-mount-private"의 비대화형 버전이나 이와 유사한 것입니다(누군가가 해결책을 알고 있는 경우). 그것은 다음과 같습니다:

% ecryptfs-mount-private -p $PASSPHRASE

비밀번호를 입력하지 않고도 비밀번호를 전달할 수 있습니다.

ecryptfs가 이를 수행할 수 없는 경우 대안을 아는 사람이 있습니까? 감사해요!

답변1

알았어, 알겠어. Xen2050에 대한 귀하의 도움에 감사드립니다. 아직 귀하에게 투표할 만큼 충분한 평판을 얻지 못했습니다.

이것은 나에게 맞는 bash 스크립트입니다.

#Set this variable to your mount passphrase. Ideally you'd get this from $1 input so that the actual value isn't stored in bash script. That would defeat the purpose.
mountphrase='YOURMOUNTPASSPHRASE' 

#Add tokens into user session keyring
printf "%s" "${mountphrase}" | ecryptfs-add-passphrase > tmp.txt

#Now get the signature from the output of the above command
sig=`tail -1 tmp.txt | awk '{print $6}' | sed 's/\[//g' | sed 's/\]//g'`
rm -f tmp.txt #Remove temp file

#Now perform the mount
sudo mount -t ecryptfs -o key=passphrase:passphrase_passwd=${mountphrase},no_sig_cache=yes,verbose=no,ecryptfs_sig=${sig},ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_passthrough=no,ecryptfs_enable_filename_crypto=no /home/user/.Private /home/user/Private

이것이 작동하려면 파일 이름 암호화를 비활성화해야 했습니다. 파일 이름 암호화를 사용하려고 하면 설치 중에 라이브러리 오류가 발생합니다. 파일 이름 암호화를 수행하지 않으려면 Private/ 디렉터리를 생성할 때 다음을 사용해야 합니다.

ecryptfs-setup-private -n

이것은 지금 나에게 효과적입니다.

"왜 이런 일을 하시나요?"라고 묻는 일부 사람들에게 대답하자면, 로그인할 때마다 내 개인 데이터가 항상 설치되는 것을 원하지는 않습니다. 실제 사용자 로그인 비밀번호를 사용할 필요 없이 데이터를 설치하는 빠른 방법이 있기를 바랍니다. 다른 사람들과 데이터를 공유하고 싶다고 상상해 보세요. 그들에게 내 비밀번호를 알려줘야 해요. 마운트 비밀번호를 사용하면 기본적으로 내 로그인보다 덜 안전한 마운트 비밀번호를 갖게 됩니다. 이는 자동으로 데이터를 마운트하고 문구를 어딘가에 저장하려는 경우에도 유용합니다(아마도 데이터 잠금을 해제하기 위한 키로 USB 스틱에 저장). 나는 로그인 비밀번호를 일반 텍스트로 어디에도 저장하고 싶지 않습니다. 그러나 이는 데이터가 무엇인지 알고 데이터 자체가 자신의 계정보다 비공개가 적다는 것을 알고 있는 경우 좋은 솔루션입니다.

답변2

먼저 ecryptfs-add-passphrase암호를 파이핑하는 것처럼 커널 키링에 암호를 넣을 수 있습니다(암호를 일반 텍스트 파일에 보관하지 않고 안전하게 유지하는 것이 문제입니다).

printf "%s" "passphrase" | ecryptfs-add-passphrase [--fnek] -

그런 다음 다음을 사용하십시오 mount.ecryptfs_private.

mount.ecryptfs_private는 루트가 아닌 사용자가 개인 디렉토리(기본적으로 ~/Private)를 암호화 방식으로 마운트할 수 있는 마운트 도우미 유틸리티입니다.

프로그램은 선택적으로 ALIAS 매개변수를 사용할 수 있습니다. ALIAS가 생략되면 프로그램은 다음을 사용하여 기본적으로 "Private"으로 설정됩니다. - $HOME/.Private를 소스로 - $HOME/Private을 대상으로 - $HOME/.ecryptfs/Private.sig를 키 서명으로 사용합니다.

ALIAS가 지정된 경우 프로그램은 다음에서 fstab(5) 스타일 구성을 찾습니다. - $HOME/.ecryptfs/ALIAS.conf 및 키 서명: - $HOME/.ecryptfs/ALIAS.sig

다음과 같은 경우에만 설치가 계속됩니다. - 필요한 비밀번호가 커널 키링에 있고 - 현재 사용자가 SOURCE 및 DESTINATION 마운트 지점을 모두 소유하고 있습니다. - DESTINATION이 아직 마운트되지 않았습니다.

프로그램은 다음을 수행합니다.

  • SOURCE를 DESTINATION에 설치
  • ecryptfs 파일 시스템으로
  • AES 암호화 사용
  • 키 길이는 16바이트입니다.
  • ~/.ecryptfs/Private.sig에 서명이 있는 비밀번호를 사용하세요.

man ecryptfs또는 키 파일이나 파일 설명자 또는 변수를 사용하여 mount원하는 방식으로 명령의 비밀번호를 가져오는 등 자신만의 라인을 읽고 설정하십시오. 다음 옵션에 주의하는 mount것과 같습니다 .mount -t ecryptfs [SRC DIR] [DST DIR] -o [OPTIONS]

   passphrase_passwd=(passphrase)
          The actual password is passphrase. Since the password is  visible
          to  utilities  (like ps under Unix) this form should only be used
          where security is not important.

   passphrase_passwd_file=(filename)
          The   password   should   be   specified   in   a    file    with
          passwd=(passphrase).  It  is  highly recommended that the file be
          stored on a secure medium such as a personal usb key.

   passphrase_passwd_fd=(file descriptor)
          The password is specified through the specified file descriptor.

   openssl_keyfile=(filename)
          The filename should be the filename of a file containing  an  RSA
          SSL key.

etc...

하지만 사용자가 로그인할 때마다 암호화된 디렉터리가 복호화/마운트된다면 로그인만 하면 되는 거겠죠?

답변3

이는 sudo 또는 임시 파일이 필요하지 않으며 파일 이름 암호화에 적합한 방법입니다. ecryptfs-mount-private 스크립트를 기반으로 작성했습니다(셸 스크립트이므로 직접 복사하고 편집할 수도 있습니다).

WRAPPED_PASSPHRASE_FILE="$HOME/.ecryptfs/wrapped-passphrase"
LOGINPASS="YOUR PASSWORD"

# If not using filename encryption
# printf "%s\0" "$LOGINPASS" | ecryptfs-unwrap-passphrase "$WRAPPED_PASSPHRASE_FILE" - | ecryptfs-add-passphrase -

# If using filename encryption
printf "%s\0" "$LOGINPASS" | ecryptfs-insert-wrapped-passphrase-into-keyring "$WRAPPED_PASSPHRASE_FILE" -

# Try mounting
/sbin/mount.ecryptfs_private >/dev/null 2>&1

관련 정보