ソフトウェアのセキュリティは、セキュリティ ソフトウェアではありません。ここでは、認証、アクセス制御、機密性、暗号化、権限管理などのトピックについて説明します。
例 2: 次のサーバー ページ ディレクティブは、イベント検証を無効にしています。
...
<system.web>
...
<pages enableEventValidation="false">
...
</pages>
</system.web>
<%@ Page ... EnableEventValidation="false" %>
HttpRuntimeSection
オブジェクトで EnableHeaderChecking
プロパティを false
に設定すれば、この動作をプログラムによって無効にできます。
Configuration config = WebConfigurationManager.OpenWebConfiguration("/MyApp");
HttpRuntimeSection hrs = (HttpRuntimeSection) config.GetSection("system.web/httpRuntime");
hrs.EnableHeaderChecking = false;
W3Clogger.loggingFields
は、プライベート データやシステム情報などの機密データのログ記録を許可するように構成できます。
builder.Services.AddW3CLogging(logging =>
logging.LoggingFields = W3CLoggingFields.All;
... )
Example 1
は、ClientIpAddress
、ServerName
、ServerIpAddress
、ServerPort
、UserName
、Cookie
などの機密データを含む、HTTP リクエスト内のすべてのフィールドのログを記録するために、フラグ All
を使用して W3Clogging を構成する方法を示しています。FormsAuthentication.RedirectFromLoginPage()
メソッドにより Authentication チケットが発行されます。この認証チケットを使用すると、ユーザーは一定期間認証された状態となります。このメソッドが 2 番目の引数 false
と一緒に呼び出されると、web.config
で設定される期間は有効のままとなるテンポラリの Authentication チケットが発行されます。このメソッドが 2 番目の引数 true
と一緒に呼び出されると、Persistent Authentication チケットが発行されます。.NET 2.0 では、Persistent Authentication チケットの継続期間は web.config
の値が基準となりますが、.NET 1.1 では、Persistent Authentication チケットに 15 年という途方もなく長いデフォルトの継続期間が設定されています。 useUnsafeHeaderParsing
プロパティを true
に設定することで、安全でない HTTP ヘッダー処理が行われます。この設定により、HTTP ヘッダーの検証ルールが不十分になるため、脆弱なアプリケーションを攻撃の危険にさらすことになります。 true
に設定されている場合、次の検証は実行されません。 useUnsafeHeaderParsing
が true に設定されています。
...
<configuration>
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing="true" />
</settings>
</system.net>
</configuration>
...
Page.EnableViewStateMac = false;
public ActionResult ActionName(Model model, string returnurl)
{
// ... controller logic
}
Example 2::The following Razor code creates a form in the resulting HTML without the built-in defense against cross-site request forgery. Note that parameter
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) {
// ... form elements
}
antiforgery
is set to either false
or null
:
@using (Html.BeginForm("actionName", "controllerName", routeValues, FormMethod.Post, antiforgery: false, htmlAtts)) {
// ... form elements
}
NSURLConnectionDelegate.connection(_:willSendRequestFor:)
委任コールバック メソッドを実装すると、NSURLConnectionDelegate.connection(_:canAuthenticateAgainstProtectionSpace:)
および NSURLConnectionDelegate.connection(_:didReceive:)
メソッドが無視されます。NSURLConnectionDelegate.connection(_:willSendRequestFor:)
委任メソッドを使用すると、デリゲートは接続認証に関する情報に基づいた決定を一度で下せるようになります。デリゲートがこのメソッドを実装している場合は、NSURLConnectionDelegate.connection(_:canAuthenticateAgainstProtectionSpace:)
または NSURLConnectionDelegate.connection(_:didReceive:)
を実装する必要はありません。実際、このようのメソッドは呼び出されないため、これらに対するセキュリティ チェックは無視されます。NSURLConnectionDelegate.connection(_:willSendRequestFor:)
委任コールバック メソッドを実装すると、NSURLConnectionDelegate.connection(_:canAuthenticateAgainstProtectionSpace:)
および NSURLConnectionDelegate.connection(_:didReceive:)
メソッドが無視されます。NSURLConnectionDelegate.connection(_:willSendRequestFor:)
委任メソッドを使用すると、デリゲートは接続認証に関する情報に基づいた決定を一度で下せるようになります。デリゲートがこのメソッドを実装している場合は、NSURLConnectionDelegate.connection(_:canAuthenticateAgainstProtectionSpace:)
または NSURLConnectionDelegate.connection(_:didReceive:)
を実装する必要はありません。実際、このようのメソッドは呼び出されないため、これらに対するセキュリティ チェックは無視されます。NSURLConnection
オブジェクト、NSURLSession
オブジェクト、または NSURLDownload
オブジェクトのデリゲートの役割です。 NSURLCredential
を初期化します。
-(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * credential)) completionHandler {
...
[challenge.sender useCredential:[NSURLCredential credentialForTrust: challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
...
}
NSURLConnection
オブジェクト、NSURLSession
オブジェクト、または NSURLDownload
オブジェクトのデリゲートの役割です。 NSURLCredential
を初期化します。
func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
...
let cred = URLCredential(user: "foo", password: "bar", persistence: .none)
let trust = challenge.protectionSpace.serverTrust
let cred = URLCredential(trust:trust!)
...
}
NSURLConnection
オブジェクト、NSURLSession
オブジェクト、または NSURLDownload
オブジェクトのデリゲートの役割です。サーバー信頼を評価するには、SecTrustEvaluate(_:_:)
メソッドを呼び出す際に、サーバーの NSURLProtectionSpace
オブジェクトの serverTrust
メソッドから取得した信頼を使用します。 SecTrustEvaluate(_:_:)
メソッドは、次の 2 つの異なる値を返します。OSStatus
値は、結果コードを表します。cancel(_:)
を使用して認証チャレンジをキャンセルする必要があります。
SecTrustRef trust = [[challenge protectionSpace] serverTrust];
SecTrustResultType result = kSecTrustResultInvalid;
OSStatus status = SecTrustEvaluate(trust, &result);
completionHandler(NSURLSessionAuthChallengeUseCredential, [challenge proposedCredential]);
NSURLConnection
オブジェクト、NSURLSession
オブジェクト、または NSURLDownload
オブジェクトのデリゲートの役割です。サーバー信頼を評価するには、SecTrustEvaluate(_:_:)
メソッドを呼び出す際に、サーバーの NSURLProtectionSpace
オブジェクトの serverTrust
メソッドから取得した信頼を使用します。 SecTrustEvaluate(_:_:)
メソッドは、次の 2 つの異なる値を返します。OSStatus
値は、結果コードを表します。cancel(_:)
を使用して認証チャレンジをキャンセルする必要があります。
let trust = challenge.protectionSpace.serverTrust
var result = SecTrustResultType.invalid
let status = SecTrustEvaluate(trust!,&secresult)
completionHandler(Foundation.URLSession.AuthChallengeDisposition.useCredential, challenge.proposedCredential)
NSURLConnection
委任は、アプリケーションが特定の保護領域における認証チャレンジの処理方法を認識していることを最初に確認しないで、認証チャレンジを処理します。NSURLProtectionSpace
オブジェクトはサーバーや、一般にレルムと呼ばれる、認証を必要とするサーバー上の領域を表します。NSURLConnectionDelegate.connection(_:didReceive:)
メソッドをコールする直前に、NSURLConnectionDelegate.connection(_:canAuthenticateAgainstProtectionSpace:)
メソッドが呼び出されます。こうすることにより、NSURLConnectionDelegate
は保護領域に対して認証を行う前に、この領域を調べることができます。デリゲートは true
を返すことにより、connection(_:didReceive:)
に対する以降のコール内で行われる認証形式が処理可能なことを示します。デリゲートがこのメソッドを実装せず、保護領域でクライアント証明書認証またはサーバー信頼認証が使用される場合は、ユーザーのキーチェーンを使用して認証されますが、これが目的の動作ではない可能性があります。NSURLConnection
委任は、アプリケーションが特定の保護領域における認証チャレンジの処理方法を認識していることを最初に確認しないで、認証チャレンジを処理します。NSURLProtectionSpace
オブジェクトはサーバーや、一般にレルムと呼ばれる、認証を必要とするサーバー上の領域を表します。NSURLConnectionDelegate.connection(_:didReceive:)
メソッドをコールする直前に、NSURLConnectionDelegate.connection(_:canAuthenticateAgainstProtectionSpace:)
メソッドが呼び出されます。こうすることにより、NSURLConnectionDelegate
は保護領域に対して認証を行う前に、この領域を調べることができます。デリゲートは true
を返すことにより、connection(_:didReceive:)
に対する以降のコール内で行われる認証形式が処理可能なことを示します。デリゲートがこのメソッドを実装せず、保護領域でクライアント証明書認証またはサーバー信頼認証が使用される場合は、ユーザーのキーチェーンを使用して認証されますが、これが目的の動作ではない可能性があります。NSURLConnection
または NSURLSession
の認証処理コールバックは、認証情報の送信先ホストをチェックできません。NSURLConnection
または NSURLSession
コールバックを実装して、認証リクエストを処理します。予測されるホストから認証リクエストが届くように設定しなかった場合は、アプリケーションによってロードされたすべての URL に認証情報が送信されます。また、この認証情報を安全に送信できることをチェックしなかった場合は、認証情報が盗まれてしまいます。
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NS URLAuthenticationChallenge *)challenge completionHandler:(void (^)(NS URLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler {
NSString *user = [self getUser];
NSString *pass = [self getPassword];
NSURLCredential *cred = [NSURLCredential credentialWithUser:user
password:pass persistence:NSURLCredentialPersistenceForSession];
completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
}
NSURLConnection
または NSURLSession
の認証処理コールバックは、認証情報の送信先ホストをチェックできません。NSURLConnection
または NSURLSession
コールバックを実装して、認証リクエストを処理します。予測されるホストから認証リクエストが届くように設定しなかった場合は、アプリケーションによってロードされたすべての URL に認証情報が送信されます。また、この認証情報を安全に送信できることをチェックしなかった場合は、認証情報が盗まれてしまいます。
func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
let user = getUser()
let pass = getPassword()
let credential = URLCredential(user: user, password: pass, persistence: .none)
completionHandler(Foundation.URLSession.AuthChallengeDisposition.useCredential, credential)
}
0.0.0.0/0
) に対して TCP ポート 22
を開く AWS セキュリティ グループを定義します。SSH サーバーは通常、受信接続リクエストに応答します。
- name: Task to open SSH port
amazon.aws.ec2_group:
name: demo_security_group
description: Open the ssh port to the world
state: present
vpc_id: 123456
region: us-west-1
rules:
- proto: tcp
ports: 22
cidr_ip: 0.0.0.0/0
- name: Create Lambda policy statement for S3 event notification
community.aws.lambda_policy:
action: lambda:InvokeFunction
function_name: functionName
principal: *
statement_id: lambda-s3-demobucket-access-log
source_arn: arn:aws:s3:us-west-2:123456789012:demobucket
source_account: 123456789012
state: present
publicly_accessible
パラメーターを yes
に設定することで Amazon Redshift クラスターへのパブリック アクセスを明示的に有効にする Ansible タスクを示しています。
- name: example1
community.aws.redshift:
identifier: mycluster
command: create
db_name: mydb
node_type: ds1.xlarge
username: "{{ username }}"
password: "{{ password }}"
publicly_accessible: yes
encrypted
パラメーターが false
に設定されているためです。
- name: Basic AMI Creation
amazon.aws.ec2_ami:
state: present
instance_id: i-xxxxxx
name: test_ami
device_mapping:
device_name: /dev/sda
encrypted: false
encrypt
パラメーターが no
に設定されているためです。
- name: EFS provisioning
community.aws.efs:
state: present
name: myTestEFS
encrypt: no
targets:
- subnet_id: subnet-12345678
security_groups: [ "sg-87654321" ]