vi、nvi、vim で機密ファイルを編集するときにリカバリファイルを抑制します

vi、nvi、vim で機密ファイルを編集するときにリカバリファイルを抑制します

私は、暗号キーやパスワードなど、極めて機密性の高い情報を含む暗号化されたデータベースを管理するアプリケーションを作成しています。このアプリケーションは、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) は、お使いの環境ではまったく受け入れられなかったり、無効になったり (可能な限り)、制限されたりする可能性があります。

以下に、相互に排他的な可能性のあるオプションをいくつか挙げます。順不同です。

  1. のように、権限のないユーザーとしてエディターを実行しますsudoedit
  2. パッチやコンパイルで削除したくない機能を独自のエディタに提供する
  3. libc問題のある関数への呼び出しを でインターセプトしますLD_PRELOAD
  4. ユーザーを.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.solibcfwritefork

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-- no autocmd、 no shell、 no write、 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" \
         --

関連情報