- 投稿日:2020-07-08T16:33:53+09:00
【C#】アクセシビリティ レベル
- 投稿日:2020-07-08T16:28:04+09:00
【C#】用語集
自分が学習する際に調べた用語集 ※随時更新
★オブジェクトとは
・操作や処理の対象になる実体を表す。
・オブジェクトの作成には「new」する。Test1.csvar testObject = new Test();
★クラスとは
・プロパティ(属性)とメソッドを定義するモノ。
★インスタンスとは
・クラスを基に具現化されたモノ(newされたモノ)。
★コンストラクターとは
・インスタンスを正しく初期化するためのメソッド。
・型名と同じ名前でメソッド定義が可能。
・戻り値を返すことは不可。Test2.csclass SampleConstructor { SampleConstructor()//コンストラクター { //インスタンスの初期化用コードを記述 } }
★型推論とは
・変数宣言にvarキーワードを使用し、右辺に設定された方を自動で決定する。
★匿名クラス
classを定義することなく名前なしクラスの使用が可能。
★メンバー変数とは
・クラス内で宣言される変数。Test3.csアクセシビリティ 型 変数名; (例) private int Sample;アクセシビリティのレベルはこちら
★「this.」とは
・現在のインスタンスを指定する。Test4.cspublic TestClass(string testThis) { this.testThis = testThis; }
★デリゲートとは
・引数として関数を1つ受け取れるデータ型(参照型)の分類。delegete 戻り値の型 デリゲート名 (関数の仮引数1[,~2,~3]);
★ラムダ式とは
・メソッドを変数と同様に扱える
・デリゲードやLINQなどのメソッド記述を簡潔にするための式。
★LINQとは
・コレクションの要素を処理するメソッドを集めたライブラリ。
・for文やforeach文を使ったループ処理を簡潔に置き換えることが可能。
※パラメーターの場合は「()」、変数が複数の場合は「,」が必要Test5.cssahen => uhen //基準 () => uhen //変数なし a1 => uhen //単一変数 (a1,a2[,a3,a4……]) => uhen //複数変数 (int a1, int a2[,int ……]) => uhen //型宣言ありの変数LINQの詳しい使い方に関してはこちら
- 投稿日:2020-07-08T13:50:26+09:00
【C#】DBの取得と値変更
- 投稿日:2020-07-08T10:09:42+09:00
.net core で秘密文字を安全に運用する(開発環境編)
プログラムでの秘密の文字列
業務系のプログラムでは、何かしらのデータベースやストレージのシステムにアクセスし、データの入出力を行います。データベースなどへの接続の際には、アカウント/パスワードといった機密の文字列を使用することが多いと思いますが、これを開発段階からリリース、運用フェーズまで安全に管理するのは意外と大変です。
プログラムから見た秘密の文字列の置き場所として、昔ながらの iniファイル、レジストリ、.NetFramework の場合は App.config に記述する方法などがありますが、基本的にプレーンテキストですので、扱いには気を使います。うっかりバージョン管理システムの管理対象にしてしまったり、デプロイ先で見つけられてしまうといったリスクがあります。ソースコードに直に埋め込んで、バイナリの中に隠すという方法も、実のところよく聞く話ですが、バイナリエディタで見れば、あっさりバレてしまいます。
独自のハッシュ化やエンコード関数を自作されている話も聞きますが、他社との共同開発になった時、ライセンシーや、その関数のソースコードを他社と共有する点で課題が発生することになります。
Microsoft の秘密文字ソリューション
秘密文字の管理のソリューションとして、Microsoft では2つの方法が提供されています。一つは、UserSecret を使う方法で、ローカルPC内の指定のディレクトリ内で管理します。管理場所が決まっていますので、うっかりバージョン管理システムにアップしてしまうこともありませんし、実装方法も簡単ですので、とっつきやすいと思います。ただ、暗号化などは行いませんので、Microsoft からは開発環境用としての位置づけとなっています。
もう一つは、Azure Key Vault を使う方法です。Azure Key Vault は、Microsoft のクラウド Azure のサービスの一つで、秘密の文字列をクラウドで管理します。Microsoft で厳重に管理されており、秘密文字へのアクセスには証明書が必要ですし、アクセスログも記録されます。エンタープライズ製品向けといえます。Microsoft では、UserSecret に比べ本番環境用として位置づけられています。
UserSecret を使った秘密文字の管理
UserSecret 及び Azure Key Vault での実装方法などを見ていきたいと思います。サンプルプログラムでは、.Net Core のコンソールで行いますが、ASP.NET などでも考え方などは変わりません。
- Visual Studio Code
- dotnet code 3.1
- console プログラム
- Windows/MacOS/Linux
プログラムの準備
dotnet コマンドで新規プロジェクトを作成します。ターミナルから次のコマンドを実行し、コンソールプログラムとして作成しています。
# mkdir vaultsample # cd vaultsample # dotnet new consoleパッケージの追加とシークレットマネージャーの初期化
UserSecrets に関連するパッケージをインストールします。.csproj ファイルがあるパスで次のコマンドを実行します。
# dotnet add package Microsoft.Extensions.Configuration # dotnet add package Microsoft.Extensions.Configuration.UserSecrets次に、シークレットマネージャーを初期化します。
# dotnet user-secrets init
インストールが完了すると、.csproj ファイルに Key Vault へのリファレンスが記述された ItemGroup と、追加されます。
ASP.NET Core の構成プロバイダーの Azure Key Vault
ASP.NET Core での開発におけるアプリシークレットの安全な保存<?xml version="1.0" encoding="utf-8"?> <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.1</TargetFramework> <UserSecretsId>07f81c45-c201-4de5-b9ff-96510163b7d6</UserSecretsId> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.1.5" /> </ItemGroup> </Project>秘密文字の登録
次のコマンドで秘密文字を登録します。秘密文字は、シークレット名と値の組み合わせで登録します。
dotnet user-secrets set "SecretName" "secret_value_1_dev" dotnet user-secrets set "Section:SecretName" "secret_value_2_dev"なお、削除するときは次のようにコマンドを実行します。
dotnet user-secrets remove "SecretName" "secret_value_1_dev"dotnet コマンドで作成しても構いませんが、格納先は下の通り、ユーザのホーム領域で、JSON 形式ですので、直接編集することもできます。
Windowsの場合%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.jsonLinux/MacOSの場合~/.microsoft/usersecrets/<user_secrets_id>/secrets.jsonまた、Visual Studio Core の拡張ツール .NET Core User Secrets を使えば、UI 上で操作できます。
プログラムから秘密文字を取得する
次に、登録した秘密文字列を、プログラムから取得する方法です。秘密文字などの管理には、ConfigurationBuilder を使用します。インスタンス化する際に、AddUserSecretsメソッドを呼び出すことで、UserSecret として登録した秘密文字を取得することができるようになります。
Program.csusing System; using Microsoft.Extensions.Configuration; namespace vaultsample { class Program { static void Main(string[] args) { var cbr = new ConfigurationBuilder() .AddUserSecrets<Program>().Build(); Console.WriteLine($" secret key is {cbr["SecretName"]}"); } } }これにより、
- 秘密文字 -> ユーザのホームディレクトリ
- 開発ソースコード -> 開発用ディレクトリ
という運用が可能になりました。
次の投稿で、Azure Key Vault を使用した、さらに安全性の高い秘密文字の運用方法を記載します。
(つづく)
<参考>
- 投稿日:2020-07-08T10:09:42+09:00
.NET Core で秘密文字を安全に運用する(開発環境編)
プログラムでの秘密の文字列
業務系のプログラムでは、何かしらのデータベースやストレージのシステムにアクセスし、データの入出力を行います。データベースなどへの接続の際には、アカウント/パスワードといった機密の文字列を使用することが多いと思いますが、これを開発段階からリリース、運用フェーズまで安全に管理するのは意外と大変です。
プログラムから見た秘密の文字列の置き場所として、昔ながらの iniファイル、レジストリ、.NetFramework の場合は App.config に記述する方法などがありますが、基本的にプレーンテキストですので、扱いには気を使います。うっかりバージョン管理システムの管理対象にしてしまったり、デプロイ先で見つけられてしまうといったリスクがあります。ソースコードに直に埋め込んで、バイナリの中に隠すという方法も、実のところよく聞く話ですが、バイナリエディタで見れば、あっさりバレてしまいます。
独自のハッシュ化やエンコード関数を自作されている話も聞きますが、他社との共同開発になった時、ライセンシーや、その関数のソースコードを他社と共有する点で課題が発生することになります。
Microsoft の秘密文字ソリューション
秘密文字の管理のソリューションとして、Microsoft から2つの方法が提供されています。一つは、UserSecret を使う方法で、ローカルPC内の指定のディレクトリ内で管理します。管理場所が決まっていますので、うっかりバージョン管理システムにアップしてしまうこともありませんし、実装方法も簡単ですので、とっつきやすいと思います。ただ、暗号化などは行いませんので、Microsoft からは開発環境用としての位置づけとなっています。
もう一つは、Azure Key Vault を使う方法です。Azure Key Vault は、Microsoft のクラウド Azure のサービスの一つで、秘密の文字列をクラウドで管理します。Microsoft で厳重に管理されており、秘密文字へのアクセスには証明書が必要ですし、アクセスログも記録されます。エンタープライズ製品向けといえます。Microsoft では、UserSecret に比べ本番環境用として位置づけられています。
UserSecret を使った秘密文字の管理
UserSecret 及び Azure Key Vault での実装方法などを見ていきたいと思います。サンプルプログラムでは、.Net Core のコンソールで行いますが、ASP.NET などでも考え方などは変わりません。
サンプルで使うもの等
- Visual Studio Code
- dotnet code 3.1
- console プログラム
- Windows/MacOS/Linux
プログラムの準備
dotnet コマンドで新規プロジェクトを作成します。ターミナルから次のコマンドを実行し、コンソールプログラムとして作成しています。
# mkdir vaultsample # cd vaultsample # dotnet new consoleパッケージの追加とシークレットマネージャーの初期化
UserSecrets に関連するパッケージをインストールします。.csproj ファイルがあるパスで次のコマンドを実行します。
# dotnet add package Microsoft.Extensions.Configuration # dotnet add package Microsoft.Extensions.Configuration.UserSecrets次に、シークレットマネージャーを初期化します。
# dotnet user-secrets init
インストールが完了すると、.csproj ファイルに Key Vault へのリファレンスが記述された ItemGroup と、追加されます。
ASP.NET Core の構成プロバイダーの Azure Key Vault
ASP.NET Core での開発におけるアプリシークレットの安全な保存<?xml version="1.0" encoding="utf-8"?> <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.1</TargetFramework> <UserSecretsId>07f81c45-c201-4de5-b9ff-96510163b7d6</UserSecretsId> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.1.5" /> </ItemGroup> </Project>秘密文字の登録
次のコマンドで秘密文字を登録します。秘密文字は、シークレット名と値の組み合わせで登録します。
dotnet user-secrets set "SecretName" "secret_value_1_dev" dotnet user-secrets set "Section:SecretName" "secret_value_2_dev"なお、削除するときは次のようにコマンドを実行します。
dotnet user-secrets remove "SecretName" "secret_value_1_dev"dotnet コマンドで作成しても構いませんが、格納先は下の通り、ユーザのホーム領域で、JSON 形式ですので、直接編集することもできます。
Windowsの場合%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.jsonLinux/MacOSの場合~/.microsoft/usersecrets/<user_secrets_id>/secrets.jsonまた、Visual Studio Core の拡張ツール .NET Core User Secrets を使えば、UI 上で操作できます。
プログラムから秘密文字を取得する
次に、登録した秘密文字列を、プログラムから取得する方法です。秘密文字などの管理には、ConfigurationBuilder を使用します。インスタンス化する際に、AddUserSecretsメソッドを呼び出すことで、UserSecret として登録した秘密文字を取得することができるようになります。
Program.csusing System; using Microsoft.Extensions.Configuration; namespace vaultsample { class Program { static void Main(string[] args) { var cbr = new ConfigurationBuilder() .AddUserSecrets<Program>().Build(); Console.WriteLine($" secret key is {cbr["SecretName"]}"); } } }これにより、
- 秘密文字 -> ユーザのホームディレクトリ
- 開発ソースコード -> 開発用ディレクトリ
という運用が可能になりました。
次の投稿で、Azure Key Vault を使用した、さらに安全性の高い秘密文字の運用方法を記載します。
(つづく)
<参考>