저는 암호화 키와 비밀번호를 포함하여 매우 민감한 정보가 포함된 암호화된 데이터베이스를 유지 관리하는 애플리케이션을 작성하고 있습니다. 이 애플리케이션은 memlock 사용, ptrace 차단, 코어 덤프 방지 등에 대해 편집증적이지만 데이터베이스 소유자가 데이터베이스의 내용을 편집할 수 있도록 허용하는 명령이 있습니다. 이 명령은 전체 데이터베이스를 사람이 읽을 수 있는 ASCII 형식의 임시 파일에 쓰고 사용자가 이를 편집할 수 있도록 합니다. 특히 새로 생성된 디렉터리 /tmp/XXXXXXXX/
(여기서 /tmp는 이상적으로는 메모리 내 파일 시스템임)에 새 파일을 생성한 다음 해당 파일에 대해 사용자가 선호하는 편집기를 실행합니다. 편집기가 종료되면 애플리케이션은 파일 내용을 구문 분석하고 해당 파일과 그 아래의 다른 모든 내용을 파쇄한 /tmp/XXXXXXXX/
후 최종적으로 디렉터리를 삭제합니다.
불행하게도 이 전략은 vi 변형에서는 잘 작동하지 않습니다. 왜냐하면 편집기는 파일의 복사본을 /var/tmp/vi.recover에 기록하게 되어 디스크에 남아 있을 수 있기 때문입니다. (데이터에는 높은 가치의 개인 키가 포함되어 있으며 전체 원시 파티션을 쉽게 검색할 수 있습니다.) 이러한 복구 파일을 억제하거나 최소한 /tmp/XXXXXXXX/
.
내 이상적인 솔루션은 대부분의 vi 변형에서 작동하지만 EDITOR
환경 변수를 구문 분석하고 각 편집기마다 다른 작업을 수행하는 것도 기쁠 것입니다. 따라서 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
때 OS X를 감지하는 자동 도구의 고대 버전을 얻는 방법을 알 수 없었기 때문에 실제로는 모르겠습니다.
주요 제품 빌드의 일부로 nvi
실행 파일의 해시를 가져와 빌드 시간 상수로 베이킹할 수 있습니다.
mg
Emacs 사용자는 다음과 같이 얻을 수 있습니다 .mg의 포크에 대한 링크. OpenBSD 소스 트리에 실제로 존재하는 변형은 ISC 라이센스를 받았습니다. 때때로 충돌이 발생하므로 패치가 필요할 수 있습니다(예: 상호 작용할 때 cscope
).
나노 사용자들은 운이 좋지 않다고 생각합니다.
삼)LD_PRELOAD
, , &c와 같은 함수에 대한 호출을 가로채기 위해 Linux에서 LD_PRELOAD
직접 ld.so
shim을 로드하는 데 사용됩니다 .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
, 표시 --commandmap
.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" \
--