私は、暗号キーやパスワードなど、極めて機密性の高い情報を含む暗号化されたデータベースを管理するアプリケーションを作成しています。このアプリケーションは、memlock の使用、ptrace のブロック、コアダンプの防止などについて慎重ですが、データベース所有者がデータベースの内容を編集できるようにするコマンドがあります。このコマンドは、データベース全体を人間が読める ASCII 形式で一時ファイルに書き込み、ユーザーが編集できるようにします。具体的には、新しく作成されたディレクトリ/tmp/XXXXXXXX/
(/tmp は理想的にはメモリ ファイル システム) に新しいファイルを作成し、そのファイルに対してユーザーの好みのエディターを実行します。エディターが終了すると、アプリケーションはファイルの内容を解析し、ファイルとその下にあるすべてのものを細断してから、/tmp/XXXXXXXX/
最終的にディレクトリを削除します。
残念ながら、この戦略はどの vi バリアントでもうまく機能しません。エディターは最終的にファイルのコピーを /var/tmp/vi.recover に書き込むため、vi がそれらを削除した後でも、それらのコピーがディスク上に残る可能性があります。(データには価値の高い秘密鍵が含まれており、raw パーティション全体を簡単に検索できます。) これらのリカバリ ファイルを抑制する、または少なくともそれらを に移動する一般的な方法を探しています/tmp/XXXXXXXX/
。
私の理想的な解決策は、ほとんどの vi バリアントで機能しますが、EDITOR
環境変数を解析して各エディターごとに異なる操作を行うこともできます。したがって、vim では機能するが他の vi では機能しない解決策がある場合、それは少なくとも良いスタートです。(私はすでに vim を特殊化して、解析エラーの正確な列番号でエディターを再度開きますが、他の vi バリアントでは適切な行でしか開くことができません。)
これは他の人に配布されるアプリケーションなので、他の人の .exrc ファイルや .vimrc ファイルを編集して問題を解決するのは不可能です。どうしても必要な場合は、エディターを実行する前に HOME 環境変数を変更し、ユーザーの実際の .vimrc と回復抑制コマンドをマージした一時的な .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
が、man ページには回復が中断されると書かれていることに気付きました。したがって、これが実際に機能するかどうかはわかりませんが、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
)、パッチを適用する必要があるかもしれません。
Nano ユーザーは運が悪いと思います。
3)LD_PRELOAD
(Linux 上で) 、 などの関数への呼び出しをインターセプトするためのシムをロードするように指示するためにLD_PRELOAD
使用します。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
、 display --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" \
--