vi、nvi、vimで重要なファイルを編集するときのファイルの回復を無効にする

vi、nvi、vimで重要なファイルを編集するときのファイルの回復を無効にする

私は、暗号化キーとパスワードを含む非常に機密性の高い情報を含む暗号化されたデータベースを維持するアプリケーションを作成しています。このアプリケーションは、memlockの使用、ptraceのブロック、コアダンプの防止などについては編集的ですが、データベース所有者がデータベースの内容を編集できるようにするコマンドがあります。このコマンドは、データベース全体を人間が読めるASCII形式の一時ファイルに書き込み、ユーザーがそれを編集できるようにします。特に、新しく作成されたディレクトリ/tmp/XXXXXXXX/(ここでは/ tmpは理想的にはメモリ内ファイルシステムです)に新しいファイルを作成し、そのファイルに対してユーザーが好むエディタを実行します。エディタが終了すると、アプリケーションはファイルの内容を解析し、そのファイルとその下の他のすべての内容を破砕し、最終的に/tmp/XXXXXXXX/ディレクトリを削除します。

残念ながら、この戦略はviバリアントではうまく機能しません。なぜなら、エディタはファイルのコピーを/var/tmp/vi.recoverに書き込んでディスクに残ることができるからです。 (データには高価な秘密鍵が含まれており、rawパーティション全体を簡単に検索できます。)これらの回復ファイルを抑制するか、少なくとも/tmp/XXXXXXXX/

私の理想的な解決策はほとんどのviバリアントで動作しますが、EDITOR環境変数を解析し、エディタごとに異なる操作を実行することもうれしいです。したがって、vimでは動作しますが、他のシステムでは動作しないソリューションがある場合、これは少なくとも良い開始です。 (私はvimがエラーが解析された正確な列番号でエディタを再び開くように特別に作成しましたが、他のviバリアントは適切な行だけを開きます。)

これは他の人に配布されるアプリケーションなので、私ができないことの1つは、問題を解決するために人々の.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)は、ご使用の環境で完全に許可されていない、無効になる(可能であれば)制限される可能性があります。

以下は潜在的に相互排他的なオプションです(特定の順序はありません)。

  1. このように、権限のないユーザーとしてエディタを実行しますsudoedit
  2. パッチやコンパイルを望まない独自のエディタ機能を提供してください
  3. libc問題のある関数の呼び出しにブロックを使用しますLD_PRELOAD
  4. ユーザーを完全にスキップします.vimrc

1) 権限のないユーザーとしてエディタを実行します。

追加のユーザーを作成したり、ソフトウェアを使用して権限のない専用ユーザーを作成する必要がある場合は、同じ方法を使用できますsudoedit。一時ファイルを作成し、ユーザーが権限のないユーザーとして編集できるようにします。一時ファイルがディスクに届かないようにする方法がわかりません。

すでに同様のことをしていますが、権限のないユーザーはいないようです。

これはスーパーユーザーの回答がどのように機能するsudoeditかを説明します。

また、sudoeditその機能がどのように機能するかをsudo調べることをお勧めします。以下は関連コードです。

2) 自分だけのバンドルを作ってくださいvi

nviコンパクトでBSDライセンスがあるため、スワップファイルを作成したり、スワップファイルをサポートせずにコンパイルしないようにパッチを適用できます。前回ビルドしようとしたnviときにOS Xを検出する自動ツールの古代バージョンを取得する方法がわからなかったので、実際にはわかりません。

主な製品ビルドの一部としてnvi実行可能ファイルのハッシュを取得し、ビルド時定数としてベーキングできます。

mgEmacsユーザーは次のように取得できます。mgのフォークへのリンク。 OpenBSDソースツリーに実際に存在するバリアントはISCライセンスを取得しました。場合によっては競合が発生するため、パッチが必要になる場合があります(たとえば、対話するときなどcscope)。

ナノユーザーは幸運ではないと思います。

三)LD_PRELOAD

、、&cなどの関数への呼び出しを傍受するために、LinuxからLD_PRELOAD直接ld.soshimをロードするために使用されます。libcfwritefork

4)ユーザー設定オプションをスキップして、vim独自の最小設定を実行します。

これは私が考えることができる最も安全なコマンドラインですが、vimおそらく何かが欠けているようです。私はvimのマニュアルページを読んで私の.vimrc

  • -u NONE- 初期化なし
  • -i NONE- いいえ.viminfo
  • -U NONE- 初期化なし(gvimしかし注意しないでください)
  • -Zargv[0]- あなたのように始めましょうrvim
  • set nocompatible——互換性がありませんvi
  • set backspace=indent,eol,start--バックスペースキーをより直感的にする
  • set noexrc- 重複する可能性があるため、ファイルを読まないでくださいrc
  • set secure--no autocmd, no shell, no write, 表示 --command 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" \
         --

関連情報