저는 암호화 키와 비밀번호를 포함하여 매우 민감한 정보가 포함된 암호화된 데이터베이스를 유지 관리하는 애플리케이션을 작성하고 있습니다. 이 응용 프로그램은 memlock 사용, ptrace 차단, 코어 덤프 방지 등에 대해 편집증적이지만 데이터베이스 소유자가 데이터베이스 내용을 편집할 수 있도록 하는 명령이 있습니다. 이 명령은 전체 데이터베이스를 사람이 읽을 수 있는 ASCII 형식의 임시 파일에 쓰고 사용자가 편집할 수 있도록 합니다. 특히 새로 생성된 디렉터리 /tmp/XXXXXXXX/
(여기서 /tmp는 이상적으로는 메모리 파일 시스템)에 새 파일을 생성한 다음 해당 파일에 대해 사용자가 선호하는 편집기를 실행합니다. 편집기가 종료되면 응용 프로그램은 파일 내용을 구문 분석하고 /tmp/XXXXXXXX/
최종적으로 디렉터리를 삭제하기 전에 파일과 그 밖의 모든 항목을 파쇄합니다 .
불행하게도 이 전략은 어떤 vi 변형에서도 잘 작동하지 않습니다. 왜냐하면 편집기는 결국 파일의 복사본을 /var/tmp/vi.recover에 기록하게 되고 vi가 파일을 삭제한 후에도 디스크에 남아 있을 가능성이 높기 때문입니다. (데이터에는 전체 원시 파티션을 쉽게 검색할 수 있는 높은 가치의 개인 키가 포함되어 있습니다.) 이러한 복구 파일을 억제하거나 최소한 /tmp/XXXXXXXX/
.
EDITOR
나의 이상적인 솔루션은 대부분의 vi 변형에서 작동하지만 환경 변수를 구문 분석하고 각 편집기마다 다른 작업을 수행하는 것도 기쁩니다 . 따라서 vim에는 작동하지만 다른 솔루션에는 작동하지 않는 솔루션이 있다면 적어도 좋은 시작입니다. (나는 이미 구문 분석 오류의 정확한 열 번호로 편집기를 다시 열 수 있도록 특수한 경우 vim을 사용했지만 다른 vi 변형은 해당 행에서만 열 수 있습니다.)
이것은 다른 사람들에게 배포하기 위한 애플리케이션이기 때문에 내가 할 수 없는 한 가지 일은 사람들의 .exrc 또는 .vimrc 파일을 편집하여 문제를 해결하는 것입니다. 절박한 상황에서는 편집기를 실행하기 전에 HOME 환경 변수를 변경하고 사용자의 실제 변수를 일부 복구 억제 명령과 병합하는 임시 .vimrc를 만들 수 있다고 가정합니다. 그러나 나는 명령줄이나 주석 솔루션을 훨씬 선호합니다.
최소한의 작업 예제에 가장 가까운 것은 내가 emacs에서 수행하는 작업을 공유하는 것입니다. 즉, 파일 끝에 다음 설명을 추가합니다.
# Local Variables:
# make-backup-files: nil
# auto-save-default: nil
# End:
가장 쉬운 방법은 명령줄 옵션이지만, vim이나 다른 vi 변형에 대해 동등한 주석이 작동할 수 있다면 그것도 좋을 것입니다.
업데이트:
strace로 몇 가지 실험을 한 후 다음 명령이 나온 것 같습니다.~할 것 같다vim을 위해 내가 원하는 것을 하세요:
vim -n -c 'set viminfo=' /tmp/XXX/secret.ini
--cmd
그러나 제안된 옵션인 에서는 작동하지 않고 에서만 작동합니다 -c
. 더욱이, 나는 실제로 무엇을 하는지 이해하지 못하지만 -n
매뉴얼 페이지에서 복구가 중단될 것이라고 말한 것을 발견했습니다. 그래서 나는 vim에 대해 잘 아는 누군가로부터 답변을 듣고 싶습니다. 실제로 이것이 효과가 있다면요. 물론 다른 vi 변형에 대한 솔루션도 환영받을 것입니다.
업데이트 2:
EXINIT 환경 변수~할 것 같다로 설정하면 vi 및 nvi에서 작동합니다 EXINIT=set dir=/tmp/XXX|set recdir=
. nvi는 시작 시 복구 부족에 대한 경고를 제공하는데 이는 고무적인 반면 vi는 파일을 파일 시스템에 삭제하지만 적어도 해당 파일은 종종 메모리 파일 시스템인 /tmp에 있습니다.
답변1
vim
다음을 사용하여 복구 파일의 위치를 이동할 수 있습니다 .directory
옵션.
set directory=/tmp/XXXXXXXX
다음과 같이 단일 인스턴스의 명령줄에 추가할 수 있습니다.
mkdir -m700 /tmp/xyz
vim --cmd "set directory=/tmp/xyz" /path/to/secure.file
답변2
편집증이 가능한 한 사용자에게 합리적인 편집기를 제공하기 위한 몇 가지 옵션을 생각해 볼 수 있습니다. 이 애플리케이션은 보안에 민감한 애플리케이션이므로 여기에 있는 모든 내용을 신중하게 고려하고 실수가 있으면 수정하시기 바랍니다.
나는 이러한 작업 중 하나를 기본값으로 수행할 것을 제안하고 싶지만 사람들이 명확하게 문서화된 옵션으로 자신의 옵션을 사용할 수 있도록 vim
명확하게 문서화된 방식으로 제공하여 잠긴 vi
.
또한 이러한 제안 중 일부(특히 를 사용한 제안 LD_PRELOAD
)는 완전히 허용되지 않거나 비활성화되거나(가능한 한) 사용자 환경에서 제한될 수 있습니다.
특별한 순서 없이 잠재적으로 상호 배타적인 옵션은 다음과 같습니다.
- 마찬가지로, 권한이 없는 사용자로 편집기를 실행하십시오
sudoedit
. - 패치하거나 컴파일하고 싶지 않은 기능을 자신만의 편집기에 제공하세요.
libc
를 사용하여 문제가 있는 함수 에 대한 호출을 차단합니다LD_PRELOAD
.- 사용자를
.vimrc
완전히 건너뜁니다.
1) 권한이 없는 사용자로 편집기를 실행합니다.
추가 사용자를 만들 수 있거나 소프트웨어를 사용하는 사람들에게 권한 없는 전용 사용자를 만들도록 요구하는 경우 sudoedit
임시 파일을 만들고 사용자가 권한 없는 사용자로 편집하도록 하는 동일한 방법을 사용할 수 있습니다. 임시 파일이 디스크에 닿지 않도록 보장하는 방법을 모르겠습니다.
이미 이와 비슷한 작업을 수행하고 있지만 권한이 없는 사용자는 없는 것 같습니다.
여기sudoedit
작동 방식을 설명하는 수퍼유저 답변.
또한 sudoedit
의 기능이 어떻게 sudo
작동하는지 연구하는 것이 좋습니다.여기에 관련 코드가 있습니다.
2) 자신만의 번들을 만드세요 vi
.
nvi
작고 BSD 라이센스가 있는 경우 패치를 적용하여 스왑 파일을 만들지 않거나 스왑 파일 지원 없이 컴파일하지 않을 수도 있습니다. 지난 번 빌드를 시도했을 nvi
때 고대 버전의 autotools를 사용하여 OS X를 감지하는 방법을 알 수 없었기 때문에 실제로는 모르겠습니다.
주요 제품 빌드의 일부로 nvi
실행 파일의 해시를 가져와 빌드 시간 상수로 베이킹할 수 있습니다.
Emacs 사용자는 mg
. 여기mg 포크에 연결. OpenBSD의 소스 트리에 실제로 존재하는 변종은 ISC 라이센스를 받았습니다. 때때로 문제가 발생하기 때문에 패치가 필요할 수도 있습니다(예: 와 상호작용하기 위해 cscope
).
나노 사용자들은 운이 좋지 않은 것 같아요.
삼)LD_PRELOAD
, , &c 와 같은 함수 에 대한 호출을 가로채기 위해 shim을 로드하도록 LD_PRELOAD
지시하는 데 사용합니다 (Linux에서).ld.so
libc
fwrite
fork
4) 에서 사용자 구성 옵션을 건너뛰고 vim
대신 자체 최소 구성을 실행하세요.
이것은 제가 생각할 수 있는 가장 완벽한 명령줄이지 vim
만 뭔가 놓쳤을 수도 있습니다. vim 매뉴얼 페이지를 읽고 내 .vimrc
.
-u NONE
-- 초기화 없음-i NONE
-- 아니요.viminfo
-U NONE
-- 초기화 없음(gvim
하지만 너무 조심하면 안 됩니다)-Z
-- 마치 당신 처럼 시작argv[0]
하세요rvim
.set nocompatible
-- 호환되지 않습니다vi
.set backspace=indent,eol,start
-- 백스페이스를 더욱 직관적으로 만듭니다.set noexrc
-- 중복될 수 있으므로 파일을 읽지 마세요rc
.set secure
-- noautocmd
, noshell
, nowrite
, 표시 - -map
명령.set nobackup
-- 백업 옵션 없음set laststatus=2
-- 편집 중인 파일을 표시합니다.
모든 것을 하나로 묶는 명령줄은 다음과 같습니다.
vim -n -u NONE -i NONE -U NONE -Z \
--cmd "set nocompatible | set backspace=indent,eol,start | set noexrc | set secure | set nomodeline | set nobackup | set laststatus=2" \
--