次の方法で共有


主要なセキュリティの概念

この記事は Windows に適用されます。

ASP.NET Core の詳細については、「 ASP.NET Core セキュリティの概要」を参照してください。

.NET では、モバイル コードに関するセキュリティ上の懸念に対処し、コンポーネントがユーザーに何を許可されているかを判断できるようにするサポートを提供するために、ロールベースのセキュリティが提供されます。

タイプの安全性とセキュリティ

タイプ セーフ コードは、アクセスが許可されているメモリの場所にのみアクセスします。 (この説明では、タイプ セーフは特にメモリ型の安全性を指し、より広範な点でタイプ セーフと混同しないでください)。たとえば、タイプ セーフなコードでは、別のオブジェクトのプライベート フィールドから値を読み取ることはできません。 適切に定義された、許容される方法でのみ型にアクセスします。

Just-In-Time (JIT) コンパイル時には、オプションの検証プロセスによって、メソッドのメタデータと共通中間言語 (CIL) が調べられ、JIT コンパイルされてネイティブ マシンコードに変換される際に、型が安全であることが確認されます。 コードに検証をバイパスするアクセス許可がある場合、このプロセスはスキップされます。 検証の詳細については、「 マネージド実行プロセス」を参照してください。

マネージド コードを実行するためにタイプ セーフの検証は必須ではありませんが、アセンブリの分離とセキュリティの適用において、型の安全性が重要な役割を果たします。 コードがタイプ セーフの場合、共通言語ランタイムはアセンブリを互いに完全に分離できます。 この分離は、アセンブリが相互に悪影響を及ぼさないようにし、アプリケーションの信頼性を高めるのに役立ちます。 タイプ セーフなコンポーネントは、異なるレベルで信頼されている場合でも、同じプロセスで安全に実行できます。 コードがタイプ セーフでない場合、望ましくない副作用が発生する可能性があります。 たとえば、ランタイムは、マネージド コードがネイティブ (アンマネージド) コードを呼び出して悪意のある操作を実行するのを防ぐことはできません。 コードがタイプ セーフの場合、ランタイムのセキュリティ強制メカニズムにより、アクセス許可がない限りネイティブ コードにアクセスしないようにします。 型セーフでないすべてのコードは、渡された列挙型メンバーSecurityPermissionを含むSkipVerificationを与えられている必要があります。

コード アクセス セキュリティ (CAS) は、.NET Framework と .NET のすべてのバージョンで非推奨になりました。 最近のバージョンの .NET では、CAS に関連する API が使用されている場合、CAS 注釈は使用されず、エラーが発生します。 開発者は、セキュリティ タスクを実行するための代替手段を求める必要があります。

校長

プリンシパルは、ユーザーの ID とロールを表し、ユーザーに代わって機能します。 .NET のロールベースのセキュリティでは、次の 3 種類のプリンシパルがサポートされています。

  • 汎用プリンシパルは、Windows ユーザーとロールとは無関係に存在するユーザーとロールを表します。

  • Windows プリンシパルは、Windows ユーザーとそのロール (または Windows グループ) を表します。 Windows プリンシパルは別のユーザーを偽装できます。つまり、プリンシパルは、そのユーザーに属する ID を提示しながら、ユーザーの代わりにリソースにアクセスできます。

  • カスタム プリンシパルは、その特定のアプリケーションに必要な任意の方法でアプリケーションによって定義できます。 プリンシパルの ID とロールの基本的な概念を拡張できます。

詳細については、「 プリンシパル オブジェクトと ID オブジェクト」を参照してください。

認証

認証は、ユーザーの資格情報を調べて、一部の機関に対してこれらの資格情報を検証することで、プリンシパルの ID を検出して検証するプロセスです。 認証中に取得された情報は、コードで直接使用できます。 .NET ロールベースのセキュリティを使用して、現在のユーザーを認証し、そのプリンシパルがコードにアクセスできるようにするかどうかを判断することもできます。 特定のロールのプリンシパルを認証する方法の例については、 WindowsPrincipal.IsInRole メソッドのオーバーロードを参照してください。 たとえば、 WindowsPrincipal.IsInRole(String) オーバーロードを使用して、現在のユーザーが Administrators グループのメンバーであるかどうかを判断できます。

現在、さまざまな認証メカニズムが使用されており、その多くは .NET ロールベースのセキュリティで使用できます。 最も一般的に使用されるメカニズムには、基本、ダイジェスト、Passport、オペレーティング システム (NTLM や Kerberos など)、またはアプリケーションで定義されたメカニズムがあります。

次の例では、アクティブなプリンシパルが管理者である必要があります。 name パラメーターはnullであり、管理者であるすべてのユーザーが要求を渡すことができます。

Windows Vista では、ユーザー アカウント制御 (UAC) によってユーザーの権限が決定されます。 組み込みの Administrators グループのメンバーである場合は、標準ユーザー アクセス トークンと管理者アクセス トークンという 2 つのランタイム アクセス トークンが割り当てられます。 既定では、標準のユーザー ロールになります。 管理者である必要があるコードを実行するには、まず特権を標準ユーザーから管理者に昇格させる必要があります。 これを行うには、アプリケーション アイコンを右クリックし、管理者として実行することを示すことで、アプリケーションを起動します。

using System;
using System.Threading;
using System.Security.Permissions;
using System.Security.Principal;

class SecurityPrincipalDemo
{

    public static void Main()
    {
        AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
        PrincipalPermission principalPerm = new PrincipalPermission(null, "Administrators");
        principalPerm.Demand();
        Console.WriteLine("Demand succeeded.");
    }
}
Imports System.Threading
Imports System.Security.Permissions
Imports System.Security.Principal



Class SecurityPrincipalDemo


    Public Shared Sub Main()
        AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)
        Dim principalPerm As New PrincipalPermission(Nothing, "Administrators")
        principalPerm.Demand()
        Console.WriteLine("Demand succeeded.")

    End Sub
End Class

次の例では、プリンシパルの ID とプリンシパルで使用できるロールを決定する方法を示します。 この例のアプリケーションは、現在のユーザーがアプリケーションの使用を許可するロールにあることを確認することです。

using System;
using System.Threading;
using System.Security.Permissions;
using System.Security.Principal;

class SecurityPrincipalDemo
{
    public static void DemonstrateWindowsBuiltInRoleEnum()
    {
        AppDomain myDomain = Thread.GetDomain();

        myDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
        WindowsPrincipal myPrincipal = (WindowsPrincipal)Thread.CurrentPrincipal;
        Console.WriteLine($"{myPrincipal.Identity.Name.ToString()} belongs to: ");
        Array wbirFields = Enum.GetValues(typeof(WindowsBuiltInRole));
        foreach (object roleName in wbirFields)
        {
            try
            {
                // Cast the role name to a RID represented by the WindowsBuildInRole value.
                Console.WriteLine($"{roleName}? {myPrincipal.IsInRole((WindowsBuiltInRole)roleName)}.");
                Console.WriteLine("The RID for this role is: " + ((int)roleName).ToString());
            }
            catch (Exception)
            {
                Console.WriteLine($"{roleName}: Could not obtain role for this RID.");
            }
        }
        // Get the role using the string value of the role.
        Console.WriteLine($"'Administrators'? {myPrincipal.IsInRole("BUILTIN\\" + "Administrators")}.");
        Console.WriteLine($"'Users'? {myPrincipal.IsInRole("BUILTIN\\" + "Users")}.");
        // Get the role using the WindowsBuiltInRole enumeration value.
        Console.WriteLine($"{WindowsBuiltInRole.Administrator}? {myPrincipal.IsInRole(WindowsBuiltInRole.Administrator)}.");
        // Get the role using the WellKnownSidType.
        SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
        Console.WriteLine($"WellKnownSidType BuiltinAdministratorsSid  {sid.Value}? {myPrincipal.IsInRole(sid)}.");
    }

    public static void Main()
    {
        DemonstrateWindowsBuiltInRoleEnum();
    }
}
Imports System.Threading
Imports System.Security.Permissions
Imports System.Security.Principal

Class SecurityPrincipalDemo

    Public Shared Sub DemonstrateWindowsBuiltInRoleEnum()
        Dim myDomain As AppDomain = Thread.GetDomain()

        myDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)
        Dim myPrincipal As WindowsPrincipal = CType(Thread.CurrentPrincipal, WindowsPrincipal)
        Console.WriteLine("{0} belongs to: ", myPrincipal.Identity.Name.ToString())
        Dim wbirFields As Array = [Enum].GetValues(GetType(WindowsBuiltInRole))
        Dim roleName As Object
        For Each roleName In wbirFields
            Try
                ' Cast the role name to a RID represented by the WindowsBuildInRole value.
                Console.WriteLine("{0}? {1}.", roleName, myPrincipal.IsInRole(CType(roleName, WindowsBuiltInRole)))
                Console.WriteLine("The RID for this role is: " + Fix(roleName).ToString())

            Catch
                Console.WriteLine("{0}: Could not obtain role for this RID.", roleName)
            End Try
        Next roleName
        ' Get the role using the string value of the role.
        Console.WriteLine("{0}? {1}.", "Administrators", myPrincipal.IsInRole("BUILTIN\" + "Administrators"))
        Console.WriteLine("{0}? {1}.", "Users", myPrincipal.IsInRole("BUILTIN\" + "Users"))
        ' Get the role using the WindowsBuiltInRole enumeration value.
        Console.WriteLine("{0}? {1}.", WindowsBuiltInRole.Administrator, myPrincipal.IsInRole(WindowsBuiltInRole.Administrator))
        ' Get the role using the WellKnownSidType.
        Dim sid As New SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, Nothing)
        Console.WriteLine("WellKnownSidType BuiltinAdministratorsSid  {0}? {1}.", sid.Value, myPrincipal.IsInRole(sid))

    End Sub

    Public Shared Sub Main()
        DemonstrateWindowsBuiltInRoleEnum()

    End Sub
End Class

認証

承認は、プリンシパルが要求されたアクションの実行を許可されているかどうかを判断するプロセスです。 承認は認証後に行われ、プリンシパルの ID とロールに関する情報を使用して、プリンシパルがアクセスできるリソースを決定します。 .NET ロールベースのセキュリティを使用して、承認を実装できます。

こちらも参照ください