ketyiaの学んだこと議事録

このサイトでは学んだことを記事にまとめていきます

ASP.NETについて勉強⑨ ~セキュリティデザイン~

ASP.NETについて勉強⑨ ~セキュリティデザイン~ かわいい


こんばんは!
今、C#ASP.NETについて学んでいますので、アウトプットで記事にまとめていきます!!

今回はセキュリティデザインについてまとめていきます。

Platform Architecture Guidance(PAG)

CDDG-PAG (Platform Architecture Guidance)は、クラウド環境のガイダンス、原則、パターン、ガードレールを確立し、維持するためのフレームワークです。よく設計されたクラウド環境は、実装を加速し、リスクを減らし、クラウドの採用を推進するのに役立ちます。

CDDG-PAGは、組織全体でエンタープライズ標準を推進するための合意を作り出す能力を持っています。これにより、認証、セキュリティ、ネットワーキング、ログ記録と監視を容易にするためのベストプラクティスの青写真とガードレールを定義します。

設計と実装の役割分担


1. ドメインエキスパート

ドメインエキスパートは、特定の業界やビジネス領域に深い知識を持つ専門家です。彼らは、アプリケーションが解決すべきビジネス上の問題や要件を理解し、それを技術チームに伝える役割を果たします。また、彼らはビジネスのニーズと技術的な制約をバランスさせるための重要な役割を果たします。

2. アプリケーションアーキテクト

アプリケーションアーキテクトは、アプリケーションの全体的な設計と構造を決定します。彼らは、システムの各部分がどのように連携するか、どのようにスケールするか、どのようにデータが流れるかなど、アプリケーションの「ビッグピクチャ」を理解しています。また、アーキテクトは、パフォーマンス、セキュリティ、拡張性などの非機能要件を考慮に入れる役割も果たします。

3. デベロッパ

デベロッパーは、アプリケーションの具体的なコードを書く役割を果たします。彼らは、ドメインエキスパートからの要件とアーキテクトからの設計ガイダンスを元に、機能を実装します。デベロッパーは、コードの品質、テスト、デバッグドキュメンテーションなど、アプリケーションのライフサイクルの多くの側面を管理します。

セキュリティ制御


1. 認証

認証は、ユーザーがシステムにアクセスする際に、そのユーザーが主張する通りの人物であることを確認するプロセスです。一般的な認証の方法には、パスワード、生体認証(指紋や顔認証など)、ワンタイムパスワード(OTP)、デジタル証明書などがあります。

2. 許可制御

許可制御(またはアクセス制御)は、認証されたユーザーがシステム内の特定のリソースにアクセスできるように制御するプロセスです。許可制御は、ユーザーの役割や権限に基づいてリソースへのアクセスを許可または拒否します。一般的な許可制御の方法には、役割ベースのアクセス制御(RBAC)、属性ベースのアクセス制御(ABAC)、マンダトリー・アクセス制御(MAC)、ディスクレショナリー・アクセス制御(DAC)などがあります。

ロールバックセキュリティ

ロールバックセキュリティは、システムが攻撃やエラーから回復するための重要な概念です。具体的には、システムが不正な状態やエラー状態になった場合、ロールバックセキュリティを利用してシステムを以前の正常な状態に戻すことができます。

例えば、ランサムウェアによる攻撃を受けた後、ロールバック機能を使用すると、デバイス上のファイルや設定を攻撃前の状態に復元することができます。攻撃者がユーザーのPCに侵入し悪意のある行動を実行した場合、時間を巻き戻してファイルシステムレジストリをリセットすることができます。また、バージョンロールバック攻撃というセキュリティ攻撃も存在します。これは、攻撃者が通信経路上にある通信内容を改ざんし、過去のバージョンに戻すことで、通信の秘密性を侵害する攻撃手法です。この攻撃に対しては、TLSの最新バージョンを使用する、攻撃に対するアラートを設定する、定期的なセキュリティアップデートを実施するなどの対策が必要です。

リソースアクセスストラテジ


1. サーバ信頼セキュリティモデル

サーバ信頼セキュリティモデルは、WebサーバとDBサーバを図太いパイプでつなぐようなモデルです。このモデルをそのままの形で実際のシステムに適用すると、「Webアプリからは何でもできてしまう」状態になり、非常に危険です。しかし、適切なセキュリティ対策を施すことで、このモデルは非常に強力なツールとなります。

2. ベースクライアントセキュリティモデル

ベースクライアントセキュリティモデルは、「偽装/委任モデル(Impersonation/Delegation Model)」とも呼ばれ、ベースクライアントを認証するセキュリティモデルです。このモデルでは、サーバはベースクライアントを「偽装」する必要があります。具体的には、Windows FormsやASP.NETからSSRSのレポートを利用する際に、ベースクライアントを偽装します。

これらのセキュリティモデルは、システムの安全性と信頼性を確保するための重要な概念であり、適切な対策とともに理解しておくことが重要です。それぞれの役割が重要であり、一緒に働くことで、より良いアプリケーションを作り出すことができます。

RBSのセキュリティデザイン4要素


1. クライアント認証方法

クライアント認証は、ユーザーがシステムにアクセスする際に、そのユーザーが主張する通りの人物であることを確認するプロセスです。一般的な認証の方法には、パスワード、生体認証(指紋や顔認証など)、ワンタイムパスワード(OTP)、デジタル証明書などがあります。

2. 内部における許可制御方式

許可制御(またはアクセス制御)は、認証されたユーザーがシステム内の特定のリソースにアクセスできるように制御するプロセスです。許可制御は、ユーザーの役割や権限に基づいてリソースへのアクセスを許可または拒否します。一般的な許可制御の方法には、役割ベースのアクセス制御(RBAC)、属性ベースのアクセス制御(ABAC)、マンダトリー・アクセス制御(MAC)、ディスクレショナリー・アクセス制御(DAC)などがあります。

3. クライアントからの通信のセキュア化

通信のセキュア化は、データがクライアントとサーバ間で安全に転送されることを保証します。通信のセキュア化には、SSL/TLSなどの暗号化プロトコルを使用します。これにより、通信内容が第三者によって傍受されても、内容を読み取ることはできません

4. 他リソースのアクセス方法

他のリソースへのアクセス方法は、システムが他のシステムやサービスと連携するための方法を定義します。これには、APIキー、OAuthトークン、サービスアカウントなどの認証情報を使用することが含まれます。これらの認証情報は、システムが他のリソースに安全にアクセスするための「鍵」の役割を果たします。

以上の4つの要素は、RBSを適用する際のセキュリティデザインの基本的な要素です。それぞれの要素が適切に設計と実装されることで、システムのセキュリティを確保することができます。

ASP.NETについて勉強⑧ ~対話型トランザクション処理~

ASP.NETについて勉強⑧ ~対話型トランザクション処理~ かわいい


こんばんは!
今、C#ASP.NETについて学んでいますので、アウトプットで記事にまとめていきます!!

今回はコレクションデータバインドについてまとめていきます。

対話型トランザクションとは


対話型トランザクションは、ユーザーとシステム間の対話を通じて行われるトランザクションの一種です。これは、ユーザーが操作を指示し、システムがそれを実行するという形式を取ります。対話型トランザクションは、ユーザーの入力に応じてシステムの動作が変化するため、非常に柔軟性があります。

対話型トランザクションの重要性


対話型トランザクションは、ユーザーとシステム間の対話を通じて、ユーザーのニーズに合わせてシステムの動作を調整する能力を提供します。これにより、システムはユーザーの具体的な要求に対応することができ、ユーザー体験を向上させることができます。また、対話型トランザクションは、システムがユーザーの入力に応じて動作を変更するため、システムの柔軟性と適応性を向上させます。これは、システムが様々なユーザー要求に対応できるようにするために重要です。

対話型トランザクションの例

 

対話型トランザクションは、ユーザーとシステム間の対話を通じて行われるトランザクションです。これは、ユーザーが操作を指示し、システムがそれを実行するという形式を取ります。

オンラインショッピングのチェックアウトプロセスは、対話型トランザクションの一例です。ユーザーは商品をカートに追加し、支払い情報を入力し、最終的に購入を確定します。この一連のステップは、ユーザーとシステム間の対話を通じて行われ、各ステップはユーザーの入力に応じて変化します。

対話型トランザクションの例②


対話型トランザクションのもう一つの例として、オンライン予約システムを挙げることができます。例えば、レストランの予約をオンラインで行う場合を考えてみましょう。ユーザーはまず、希望の日付と時間、人数を入力します。システムはそれらの情報に基づいて利用可能なテーブルを表示します。次に、ユーザーは適切なテーブルを選択し、必要な情報(例えば、名前や連絡先情報)を入力して予約を確定します。

この一連のステップは、ユーザーとシステム間の対話を通じて行われ、各ステップはユーザーの入力に応じて変化します。これにより、システムはユーザーの具体的な要求に対応することができ、ユーザー体験を向上させることができます。

 

長時間トランザクションの典型的な業務


対話型処理

ユーザーとシステムが直接対話する形式の処理です。ユーザーが操作を行い、システムがそれに応じて反応します。このタイプの処理は、リアルタイムでの応答が必要な場合や、ユーザーが直接結果を確認したい場合に適しています。例えば、ATMでの銀行取引や、オンラインショッピングサイトでの商品検索などが対話型処理の一例です。

バッチ処理

一連のジョブを集めて一度に処理する方式です。これらのジョブは、ユーザーの介入なしに自動的に実行されます。バッチ処理は、大量のデータを効率的に処理する必要がある場合や、処理に時間がかかる場合に適しています。例えば、銀行が一日の取引をまとめて処理する場合や、大量のメールを一度に送信する場合などがバッチ処理の一例です。

対話型トランザクション処理の設計パターン


対話型トランザクション処理では、複数のユーザーが同時にデータにアクセスし、それを更新する可能性があります。これにより、データの整合性を保つための設計パターンが必要となります。今回は、その中でも3つの主要な設計パターンについて詳しく見ていきましょう。

1. 後勝ちルール適応

後勝ちルールとは、最後に更新したユーザーの変更が反映されるというルールです。このルールは、シンプルで理解しやすいため、多くのシステムで採用されています。

具体的な実装方法としては、各レコードにタイムスタンプを付け、最新のタイムスタンプを持つ更新が有効となるようにします。これにより、同時に複数のユーザーが同じデータを更新した場合でも、最後に更新したユーザーの変更が反映されます。

2. 業務排他制御の作りこみ

業務排他制御とは、一度に一人のユーザーだけが特定のデータを更新できるように制御する方法です。これにより、データの整合性を保つことができます。

具体的な実装方法としては、データにロックをかけることで、他のユーザーが同時にそのデータを更新することを防ぎます。ユーザーがデータを更新し終えたら、ロックを解除します。これにより、一度に一人のユーザーだけがデータを更新できるようになります。

3. 楽観同時実行制御の作りこみ

楽観同時実行制御とは、データの更新時に競合が発生する可能性が低いと仮定し、更新の競合が発生した場合にのみ対処する方法です。

具体的な実装方法としては、各レコードにバージョン番号を付け、更新時にバージョン番号をチェックします。更新を試みるユーザーがデータを取得した時点のバージョン番号と、現在のバージョン番号が一致していれば更新を許可し、一致していなければ更新を拒否します。これにより、更新の競合が発生した場合にのみ対処することができます。

実際にASP.NET Web Formsで試してみる


以下のようなコードを書いてみます

>|C#|
/*
 * FileName: test.aspx.cs
 * Created by: keita
 * Created on: 2024.6
 * 
 * Description: 
* 後勝ちルール適応
*/


public class Record
{
    public int Id { get; set; }
    public string Data { get; set; }
    public DateTime LastUpdated { get; set; }
}

public void UpdateRecord(Record newRecord)
{
    var existingRecord = _dbContext.Records.Find(newRecord.Id);
   
  if (newRecord.LastUpdated > existingRecord.LastUpdated)
    {
        existingRecord.Data = newRecord.Data;
        existingRecord.LastUpdated = newRecord.LastUpdated;
    }
   
  _dbContext.SaveChanges();
}
||<

 

>|C#|
/*
 * FileName: test.aspx.cs
 * Created by: keita
 * Created on: 2024.6
 * 
 * Description: 
* 業務排制御
*/
public class Record
{
    public int Id { get; set; }
    public string Data { get; set; }
    public bool IsLocked { get; set; }
}

public void UpdateRecord(Record newRecord)
{
    var existingRecord = _dbContext.Records.Find(newRecord.Id);

    if (!existingRecord.IsLocked)
    {
        existingRecord.IsLocked = true;
        existingRecord.Data = newRecord.Data;
        _dbContext.SaveChanges();
        existingRecord.IsLocked = false;
    }
}
||<

 

>|C#|
/*
 * FileName: test.aspx.cs
 * Created by: keita
 * Created on: 2024.6
 * 
 * Description: 
* 楽観同時実行制御
*/
public class Record
{
    public int Id { get; set; }
    public string Data { get; set; }
    public int Version { get; set; }
}

public void UpdateRecord(Record newRecord)
{
    var existingRecord = _dbContext.Records.Find(newRecord.Id);

    if (newRecord.Version == existingRecord.Version)
    {
        existingRecord.Data = newRecord.Data;
        existingRecord.Version++;
    }

    _dbContext.SaveChanges();
}
||<


コードはそれぞれ下記のようになっています!
実行はしませんが、参考程度に~

後勝ちルール適応

このコードでは、Record クラスが定義されており、各レコードは Id、Data、LastUpdated の3つのプロパティを持っています。UpdateRecord メソッドでは、新しいレコードが既存のレコードよりも新しい(LastUpdated が新しい)場合にのみ、既存のレコードを更新します。

業務排他制御の作りこみ

このコードでは、Record クラスに IsLocked プロパティが追加されています。UpdateRecord メソッドでは、既存のレコードがロックされていない場合にのみ、レコードを更新します。更新が完了したら、ロックを解除します。

楽観同時実行制御の作りこみ

このコードでは、Record クラスに Version プロパティが追加されています。UpdateRecord メソッドでは、新しいレコードのバージョンが既存のレコードのバージョンと一致している場合にのみ、レコードを更新します。更新が成功したら、バージョンをインクリメントします。


システムを運用していく上で、設計部分のコアを担うものなので、しっかり頭に入れておきたいものです。

今日はここまでです♪
ここまで読んでいただきありがとうございます!

ASP.NETについて勉強⑦ ~コレクションデータバインド~

ASP.NETについて勉強⑦ ~コレクションデータバインド~


こんばんは!
今、C#ASP.NETについて学んでいますので、アウトプットで記事にまとめていきます!!

今回はコレクションデータバインドについてまとめていきます。

コレクションデータバインド


ASP.NETでは、コレクションデータバインドを使用して、コレクションデータソース(リスト、配列など)をユーザーインターフェースコントロール(GridView、ListViewなど)にバインドできます。

ASP.NETでのコレクションデータバインドの基本的な手順は以下になります!

データソースの準備

最初に、バインドするデータソースを準備します。これは、オブジェクトのリストや配列などのコレクションデータソースである可能性があります。

コントロールの準備

次に、データを表示するためのユーザーインターフェースコントロールを準備します。これは、GridView、ListView、DropDownListなどのコントロールである可能性があります。

データバインド

最後に、データソースをコントロールにバインドします。これは、コントロールのDataSourceプロパティをデータソースに設定し、DataBindメソッドを呼び出すことで行います。

リスト構造型データバインド


リスト構造型データバインドは、単一のデータ項目のリストまたはコレクションを表示するために使用されます。これは、ListBox、DropDownList、RadioButtonListなどのコントロールで使用されます。各項目は、データソースの各エントリに対応します。

テーブル構造型データバインド


テーブル構造型データバインドは、複数のデータ項目のリストまたはコレクションを表示するために使用されます。これは、GridView、DetailsView、FormViewなどのコントロールで使用されます。各行は、データソースの各エントリに対応し、各列は、エントリの各プロパティまたはフィールドに対応します。

GridViewコントロール

GridViewコントロールは、データソースから複数のレコードを表示するためのコントロールです。各行はデータソースの各エントリに対応し、各列はエントリの各プロパティまたはフィールドに対応します。GridViewコントロールは、レコードの一覧表示、ソート、ページング、編集、削除などの機能を提供します。

DetailsViewコントロール

DetailsViewコントロールは、データソースから単一のレコードを表示するためのコントロールです。各フィールドは個別の行に表示され、各行はフィールドの名前と値を表示します。DetailsViewコントロールは、レコードの詳細表示、編集、挿入、ページングなどの機能を提供します。

FormViewコントロール

FormViewコントロールも、データソースから単一のレコードを表示するためのコントロールです。しかし、FormViewコントロールはテンプレートベースのコントロールであり、表示する内容とそのレイアウトを完全にカスタマイズすることができます。FormViewコントロールは、レコードの詳細表示、編集、挿入、ページングなどの機能を提供します。

階層構造型データバインド


階層構造型データバインドは、親子関係を持つデータ項目のリストまたはコレクションを表示するために使用されます。これは、TreeView、Menuなどのコントロールで使用されます。各項目は、データソースの各エントリに対応し、項目の階層構造は、エントリ間の親子関係に対応します。

ObjectDataSourceオブジェクト


ObjectDataSourceオブジェクトは、データバインドコントロール(例えば、GridView、DetailsView、FormViewなど)がビジネスオブジェクトまたはデータコンポネントと連携するためのブリッジとして機能します。これにより、データバインドコントロールはデータの選択、挿入、更新、削除などの操作を行うことができます。

データコンポネント


データコンポネントは、データベースやXMLファイルなどのデータソースとアプリケーションの間に位置するコンポーネントです。これらは、データの取得、更新、削除などの操作をカプセル化し、これらの操作をアプリケーションの他の部分から分離します。データコンポネントは、ObjectDataSourceオブジェクトによってデータバインドコントロールと連携します。

実際にASP.NET Web Formsで試してみる


以下のようなコードを書いてみます

>|aspx| 
<%--
    FileName: test.aspx
    Created by: keita
  Created on: 2024.6

    Description: 
   コレクションデータバインド
--%>

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="test" %>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:ListBox ID="ListBox1" runat="server"></asp:ListBox>
            <asp:GridView ID="GridView1" runat="server"></asp:GridView>
            <asp:TreeView ID="TreeView1" runat="server"></asp:TreeView>
        </div>
    </form>
</body>
</html>
||<

 

>|C#|
/*
 * FileName: test.aspx.cs
 * Created by: keita
 * Created on: 2024.6
 * 
 * Description: 
* コレクションデータバインド
*/
using System;

public partial class test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // リスト構造型データバインド
        List<string> listData = new List<string> { "Item 1", "Item 2", "Item 3" };
        ListBox1.DataSource = listData;
        ListBox1.DataBind();
        // テーブル構造型データバインド
        List<Person> tableData = new List<Person>
        {
            new Person { Name = "John", Age = "30" },
            new Person { Name = "Jane", Age = "25" },
            new Person { Name = "Doe", Age = "35" }
        };
        GridView1.DataSource = tableData;
        GridView1.DataBind();
        // 階層構造型データバインド
        TreeNode rootNode = new TreeNode("Root");
        TreeNode childNode1 = new TreeNode("Child 1");
        TreeNode childNode2 = new TreeNode("Child 2");
        rootNode.ChildNodes.Add(childNode1);
        rootNode.ChildNodes.Add(childNode2);
        TreeView1.Nodes.Add(rootNode);
    }
    private class Person
    {
        public string Name { get; set; }
        public string Age { get; set; }
    }
}
||<


では実行してみましょう


ASP.NETでのリスト構造型データバインド、テーブル構造型データバインド、階層構造型データバインドを表示します。

使いこなせると色々なデータの表現ができそうですね!面白い~

今日はここまでです♪
ここまで読んでいただきありがとうございます!