デスクトップアプリケーションに「管理者パスワード」を提供するためのいくつかの可能な代替策は何ですか?


10

私は現在、会社で10年以上使用されているソフトウェアを管理およびリファクタリングしています。このアプリケーションの要素の1つは、管理者モードまたはパワーユーザーモードの一種で、追加/内部入力や、入力制限をオフにする機能などを提供します。

歴史的にこのモードは、Windowsシステムディレクトリの特定の場所(どちらもアプリケーションにハードコードされていました)に特定の名前のファイルを配置することでオンになりました。 DLLではなくASCIIファイル。

そこで、最近、ユーザーが管理者パスワードを入力してこの機能をオンにできるようにするコードと小さなモーダルフォームを追加しました。これは設定されたパスワードであり、ユーザー固有ではありません。正しいパスワードが入力されると、アプリケーションのルートディレクトリに「キーファイル」を作成することによって同じことを行い、そのファイルが存在する場合にプログラムが管理モードで起動できるようにします。

今、このソフトウェアが主に使用する部門のマネージャーは、その考えをあまり好きではありません。彼は、単純で事前に設定されたパスワードがあれば簡単に「出て行ける」と考えており、経験の浅いユーザーがこれらの追加機能にアクセスすることを望んでいないと考えています。

だから私の質問は、この種のアクセスを提供するために、いくらか安全な他の方法があるのですか?このソフトウェアの保守と管理に関しては、私だけです。したがって、ほとんど完全に組み込まれていないか自動化されていないものは役に立ちません(たとえば、「ライセンスキー」の要求を送信するなど)。

注:このアプリケーションはVB.NET(.NET 4.0)で記述されており、現在、新しいバージョンが完了したらクリックワンス展開を使用することを計画しています。


1
誰かが「未経験」のユーザーとそうでないユーザーを決定しなければなりません。誰がその決定をしますか?その決定をシステムに入れなければならないのは誰ですか?
Doc Brown

回答:


13

Active Directoryがある場合は、Active Directoryグループのメンバーシップをテストできます。

public bool IsInADGroup(string ADGroupName)
    {
        bool result = false;
        List<string> myGroups = new List<string>();

        using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, SystemInformation.UserDomainName))
        {
            using (PrincipalSearchResult<Principal> src = UserPrincipal.FindByIdentity(pc, SystemInformation.UserName).GetGroups(pc))
            {
                src.ToList().ForEach(sr => myGroups.Add(sr.SamAccountName));
            }
        }
        result = myGroups.Contains(ADGroupName);
        return result;
    }

これは非常に良い答えであり、これと他のプロジェクトのために私が間違いなく心に留めておくものです。しかし、本当の問題は、社外のこのプログラムのユーザーです。姉妹会社と数社の外部のサードパーティユーザーの両方に提供しています。私は実際にこの時点で、私たちのネットワークの外の人たちのためにこれらの機能を完全に無効にし、あなたの提案を内部の目的に使用することが最善であろうと考えています。
アンソニー

5

マネージャーはパスワードが出ることについて正しいです。それは問題ではなく、いつかということです。

一部のユーザーはActive Directoryを利用できないため、スーパーユーザーアクセスを許可するWindowsログイン名のリストを含む署名付きテキストファイルを作成できます。これは、人々がコンピュータやログインを共有していないことを前提としています。

ユーザー名は、簡単に配布できるテキストファイルに入れられ、アプリケーションのフォルダーに配置されます。重要な部分は、ユーザー名のリストに署名することです。非常にシンプルにしてください。行ごとに1つのユーザー名を入力し、最後の行にハッシュを配置します。プログラムのバイナリにある種の秘密鍵を埋め込み、ユーザー名でハッシュします。秘密鍵は、人々がファイルを変更し、それからハッシュを計算することを防ぎます(これはおそらく最初から遠く離れています)。

UserName1
UserName2
.
.
.
UserName34
<HashOfUserNamesAndSecretKey>

もちろん、これには、承認されたユーザーのリストの管理者として行動する誰かが必要です。管理者は、ファイルとハッシュを生成するプログラム(あなたが書いた!)が必要です。他に何もない場合は、ユーザー名のテキストファイルを取得してハッシュを追加するだけです。

徹底的にするために、アクセス権が取り消されたユーザーは、まだログイン名が含まれているファイルのコピーを取得できます。アクセスが必要なときはいつでも、コピーを配置することができます。おそらく心配する必要はありません。


3

Active Directoryはオプションではないため、現在の日付をハッシュします。最初にエントロピーが最も大きい要素(月の日)と最後にエントロピーが最も小さい要素(年)を使用します。必要に応じて、ドメイン固有のソルト(社外で使用されるため、顧客ID、会社名など)を追加します。これにより、毎日非常に異なるパスワードが生成され、エンドユーザーが推測することは事実上不可能であり、ソフトウェアを使用する企業によって異なる可能性があります。

ソフトウェアは家に電話をかけずにユーザーを認証できる必要があるため、これは本質的に鶏と卵の問題です。だから、本当にわかりにくいクラッキングメカニズムを使って卵を作ってください。あいまいさによるセキュリティは実際のセキュリティではありませんが、これは問題のパラメーターとして与えた最高のものです。

これは、テキストファイルをどこかに配置するよりも優れています。シークレットが取得されると、ゲームオーバーになるため、静的なパスワードに勝るものはありません。


0

アクセス制御リストを使用します。

これをすばやく簡単に行うには、アプリケーションディレクトリからすべてのアクセス許可(読み取りアクセス許可を含む)を削除し、アプリケーションの実行を許可されているすべてのユーザーにこれらのアクセス許可を追加します。もちろん、権限のあるユーザーがアプリケーションディレクトリをパブリックの場所に簡単にコピーすることもできますが、これは偶然に起こることはほとんどありませんが、パスワードの共有は偶然に起こります。

もちろん、これは関係するコンピュータが(できればActive Directoryで)セキュリティで保護されていることを前提としています。


関連するコンピューターがActive Directoryで保護されている場合は、セキュリティグループのメンバーシップによって高度な機能を保護するのが最善の方法です。ユーザーは必要に応じてグループに追加でき、ファイルシステムのアクセス許可は関係ありません
Kevin

@ケビン:同意する。ダンの答えはそれをカバーしていると思います。
ブライアン

0

私の好みは@Danの提案どおりです-Active Directoryを使用してください。これが不可能な場合は、時間に基づくパスワードジェネレータが役立ちます。同様の状況で、(非常に遠い)私が働いていた私の会社の1つが9999-MMDDを使用していました。これは数年後には消えました。hhmmを投入して少し混ぜた場合、誰かが猫を袋から出すまでに1〜2年かかる可能性があります。

同様の、しかしより複雑な戦略を使用して、パスワードを生成するプログラムをいつでも作成できます。使用されている名前にマシン名も含めます。管理者はそのプログラムを実行して、そのマシンのみの現在のパスワードを取得できます。別のマシンにコピーしたり、別のユーザーがログインしたりした場合に無効になるように、ファイルに情報を保存します。プログラムの安全を維持するのはマネージャーの責任であり、猫が外に出た場合はその責任です。

このスキームは暗号化の観点からは弱くて信頼できないと考えられていますが、あなたが抱えている問題には十分です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.