PowerShellを使用したONTAPサイバーバックアップの強化
ONTAPサイバーボールトは、従来のソリューションに比べてサイバー攻撃に対する耐障害性が向上します。セキュリティを強化するアーキテクチャを設計する際には、攻撃の表面積を削減するための対策を検討することが重要です。これは、強化されたパスワードポリシーの実装、RBACの有効化、デフォルトのユーザーアカウントのロック、ファイアウォールの設定、ボルトシステムへの変更に対する承認フローの利用など、さまざまな方法で実現できます。さらに、ネットワークアクセスプロトコルを特定のIPアドレスから制限することは、潜在的な脆弱性を制限するのに役立ちます。
ONTAPには、ONTAPストレージを強化するための一連の制御機能が用意されています。を使用して"ONTAPのガイダンスと構成設定"、組織が情報システムの機密性、整合性、可用性に関する規定のセキュリティ目標を達成できるようにします。
強化のベストプラクティス
手動手順
-
事前定義されたカスタム管理ロールを持つ指定ユーザーを作成します。
-
新しいIPspaceを作成してネットワークトラフィックを分離します。
-
新しいIPspaceに新しいSVMを作成します。
-
ファイアウォールルーティングポリシーが適切に設定されていること、およびすべてのルールが定期的に監査され、必要に応じて更新されていることを確認します。
ONTAP CLIまたは自動スクリプトを使用
-
マルチ管理者検証(MFA)による管理の保護
-
クラスタ間の「転送中」の標準データの暗号化を有効にします。
-
強力な暗号化暗号を使用してSSHを保護し、セキュアなパスワードを適用します。
-
グローバルFIPSを有効にします。
-
TelnetとRemote Shell(RSH;リモートシェル)は無効にする必要があります。
-
デフォルトの管理者アカウントをロックします。
-
データLIFを無効にし、リモートアクセスポイントを保護します。
-
使用していないプロトコルや無関係なプロトコルやサービスを無効にして削除します。
-
ネットワークトラフィックを暗号化します。
-
スーパーユーザロールと管理ロールを設定する場合は、最小権限の原則を使用します。
-
[Allowed IP]オプションを使用して、特定のIPアドレスからのHTTPSとSSHを制限します。
-
転送スケジュールに基づいてレプリケーションを休止および再開します。
1~4の箇条書きには、分離されたネットワークの指定やIPspaceの分離など、手動の操作が必要です。この操作は事前に行う必要があります。セキュリティ強化を設定するための詳細については、を参照し"ONTAPセキュリティ強化ガイド"てください。残りは簡単に自動化でき、導入と監視が容易になります。このオーケストレーションされたアプローチの目的は、ヴォールトコントローラの将来を保証するための強化手順を自動化するメカニズムを提供することです。サイバーボールトのエアギャップが開いている期間は、できるだけ短くなっています。SnapVaultはインクリメンタルフォーエバーテクノロジーを活用しています。これは、前回の更新以降の変更のみをサイバーボールトに移動するため、サイバーボールトを開いておく必要がある時間を最小限に抑えることができます。ワークフローをさらに最適化するために、サイバーボールトのオープンはレプリケーションスケジュールに合わせて調整され、接続ウィンドウが最小になります。
ここでは、ONTAPコントローラを強化するためのPowerShellコード例を示します。
function removeSvmDataProtocols {
try {
# checking NFS service is disabled
logMessage -message "Checking if NFS service is disabled on vServer $DESTINATION_VSERVER"
$nfsService = Get-NcNfsService
if($nfsService) {
# Remove NFS
logMessage -message "Removing NFS protocol on vServer : $DESTINATION_VSERVER"
Remove-NcNfsService -VserverContext $DESTINATION_VSERVER -Confirm:$false
logMessage -message "NFS protocol removed on vServer : $DESTINATION_VSERVER" -type "SUCCESS"
} else {
logMessage -message "NFS service is disabled on vServer $DESTINATION_VSERVER" -type "SUCCESS"
}
# checking CIFS/SMB server is disabled
logMessage -message "Checking if CIFS/SMB server is disabled on vServer $DESTINATION_VSERVER"
$cifsServer = Get-NcCifsServer
if($cifsServer) {
# Remove SMB/CIFS
logMessage -message "Removing SMB/CIFS protocol on vServer : $DESTINATION_VSERVER"
$domainAdministratorUsername = Read-Host -Prompt "Enter Domain administrator username"
$domainAdministratorPassword = Read-Host -Prompt "Enter Domain administrator password" -AsSecureString
$plainPassword = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($domainAdministratorPassword))
Remove-NcCifsServer -VserverContext $DESTINATION_VSERVER -AdminUsername $domainAdministratorUsername -AdminPassword $plainPassword -Confirm:$false -ErrorAction Stop
logMessage -message "SMB/CIFS protocol removed on vServer : $DESTINATION_VSERVER" -type "SUCCESS"
} else {
logMessage -message "CIFS/SMB server is disabled on vServer $DESTINATION_VSERVER" -type "SUCCESS"
}
# checking iSCSI service is disabled
logMessage -message "Checking if iSCSI service is disabled on vServer $DESTINATION_VSERVER"
$iscsiService = Get-NcIscsiService
if($iscsiService) {
# Remove iSCSI
logMessage -message "Removing iSCSI protocol on vServer : $DESTINATION_VSERVER"
Remove-NcIscsiService -VserverContext $DESTINATION_VSERVER -Confirm:$false
logMessage -message "iSCSI protocol removed on vServer : $DESTINATION_VSERVER" -type "SUCCESS"
} else {
logMessage -message "iSCSI service is disabled on vServer $DESTINATION_VSERVER" -type "SUCCESS"
}
# checking FCP service is disabled
logMessage -message "Checking if FCP service is disabled on vServer $DESTINATION_VSERVER"
$fcpService = Get-NcFcpService
if($fcpService) {
# Remove FCP
logMessage -message "Removing FC protocol on vServer : $DESTINATION_VSERVER"
Remove-NcFcpService -VserverContext $DESTINATION_VSERVER -Confirm:$false
logMessage -message "FC protocol removed on vServer : $DESTINATION_VSERVER" -type "SUCCESS"
} else {
logMessage -message "FCP service is disabled on vServer $DESTINATION_VSERVER" -type "SUCCESS"
}
} catch {
handleError -errorMessage $_.Exception.Message
}
}
function disableSvmDataLifs {
try {
logMessage -message "Finding all data lifs on vServer : $DESTINATION_VSERVER"
$dataLifs = Get-NcNetInterface -Vserver $DESTINATION_VSERVER | Where-Object { $_.Role -contains "data_core" }
$dataLifs | Select-Object -Property InterfaceName, OpStatus, DataProtocols, Vserver, Address
logMessage -message "Disabling all data lifs on vServer : $DESTINATION_VSERVER"
# Disable the filtered data LIFs
foreach ($lif in $dataLifs) {
$disableLif = Set-NcNetInterface -Vserver $DESTINATION_VSERVER -Name $lif.InterfaceName -AdministrativeStatus down -ErrorAction Stop
$disableLif | Select-Object -Property InterfaceName, OpStatus, DataProtocols, Vserver, Address
}
logMessage -message "Disabled all data lifs on vServer : $DESTINATION_VSERVER" -type "SUCCESS"
} catch {
handleError -errorMessage $_.Exception.Message
}
}
function configureMultiAdminApproval {
try {
# check if multi admin verification is enabled
logMessage -message "Checking if multi-admin verification is enabled"
$maaConfig = Invoke-NcSsh -Name $DESTINATION_ONTAP_CLUSTER_MGMT_IP -Credential $DESTINATION_ONTAP_CREDS -Command "set -privilege advanced; security multi-admin-verify show"
if ($maaConfig.Value -match "Enabled" -and $maaConfig.Value -match "true") {
$maaConfig
logMessage -message "Multi-admin verification is configured and enabled" -type "SUCCESS"
} else {
logMessage -message "Setting Multi-admin verification rules"
# Define the commands to be restricted
$rules = @(
"cluster peer delete",
"vserver peer delete",
"volume snapshot policy modify",
"volume snapshot rename",
"vserver audit modify",
"vserver audit delete",
"vserver audit disable"
)
foreach($rule in $rules) {
Invoke-NcSsh -Name $DESTINATION_ONTAP_CLUSTER_MGMT_IP -Credential $DESTINATION_ONTAP_CREDS -Command "security multi-admin-verify rule create -operation `"$rule`""
}
logMessage -message "Creating multi admin verification group for ONTAP Cluster $DESTINATION_ONTAP_CLUSTER_MGMT_IP, Group name : $MULTI_ADMIN_APPROVAL_GROUP_NAME, Users : $MULTI_ADMIN_APPROVAL_USERS, Email : $MULTI_ADMIN_APPROVAL_EMAIL"
Invoke-NcSsh -Name $DESTINATION_ONTAP_CLUSTER_MGMT_IP -Credential $DESTINATION_ONTAP_CREDS -Command "security multi-admin-verify approval-group create -name $MULTI_ADMIN_APPROVAL_GROUP_NAME -approvers $MULTI_ADMIN_APPROVAL_USERS -email `"$MULTI_ADMIN_APPROVAL_EMAIL`""
logMessage -message "Created multi admin verification group for ONTAP Cluster $DESTINATION_ONTAP_CLUSTER_MGMT_IP, Group name : $MULTI_ADMIN_APPROVAL_GROUP_NAME, Users : $MULTI_ADMIN_APPROVAL_USERS, Email : $MULTI_ADMIN_APPROVAL_EMAIL" -type "SUCCESS"
logMessage -message "Enabling multi admin verification group $MULTI_ADMIN_APPROVAL_GROUP_NAME"
Invoke-NcSsh -Name $DESTINATION_ONTAP_CLUSTER_MGMT_IP -Credential $DESTINATION_ONTAP_CREDS -Command "security multi-admin-verify modify -approval-groups $MULTI_ADMIN_APPROVAL_GROUP_NAME -required-approvers 1 -enabled true"
logMessage -message "Enabled multi admin verification group $MULTI_ADMIN_APPROVAL_GROUP_NAME" -type "SUCCESS"
logMessage -message "Enabling multi admin verification for ONTAP Cluster $DESTINATION_ONTAP_CLUSTER_MGMT_IP"
Invoke-NcSsh -Name $DESTINATION_ONTAP_CLUSTER_MGMT_IP -Credential $DESTINATION_ONTAP_CREDS -Command "security multi-admin-verify modify -enabled true"
logMessage -message "Successfully enabled multi admin verification for ONTAP Cluster $DESTINATION_ONTAP_CLUSTER_MGMT_IP" -type "SUCCESS"
logMessage -message "Enabling multi admin verification for ONTAP Cluster $DESTINATION_ONTAP_CLUSTER_MGMT_IP"
Invoke-NcSsh -Name $DESTINATION_ONTAP_CLUSTER_MGMT_IP -Credential $DESTINATION_ONTAP_CREDS -Command "security multi-admin-verify modify -enabled true"
logMessage -message "Successfully enabled multi admin verification for ONTAP Cluster $DESTINATION_ONTAP_CLUSTER_MGMT_IP" -type "SUCCESS"
}
} catch {
handleError -errorMessage $_.Exception.Message
}
}
function additionalSecurityHardening {
try {
$command = "set -privilege advanced -confirmations off;security protocol modify -application telnet -enabled false;"
logMessage -message "Disabling Telnet"
Invoke-NcSsh -Name $DESTINATION_ONTAP_CLUSTER_MGMT_IP -Credential $DESTINATION_ONTAP_CREDS -Command $command
logMessage -message "Disabled Telnet" -type "SUCCESS"
#$command = "set -privilege advanced -confirmations off;security config modify -interface SSL -is-fips-enabled true;"
#logMessage -message "Enabling Global FIPS"
##Invoke-SSHCommand -SessionId $sshSession.SessionId -Command $command -ErrorAction Stop
#logMessage -message "Enabled Global FIPS" -type "SUCCESS"
$command = "set -privilege advanced -confirmations off;network interface service-policy modify-service -vserver cluster2 -policy default-management -service management-https -allowed-addresses $ALLOWED_IPS;"
logMessage -message "Restricting IP addresses $ALLOWED_IPS for Cluster management HTTPS"
Invoke-NcSsh -Name $DESTINATION_ONTAP_CLUSTER_MGMT_IP -Credential $DESTINATION_ONTAP_CREDS -Command $command
logMessage -message "Successfully restricted IP addresses $ALLOWED_IPS for Cluster management HTTPS" -type "SUCCESS"
#logMessage -message "Checking if audit logs volume audit_logs exists"
#$volume = Get-NcVol -Vserver $DESTINATION_VSERVER -Name audit_logs -ErrorAction Stop
#if($volume) {
# logMessage -message "Volume audit_logs already exists! Skipping creation"
#} else {
# # Create audit logs volume
# logMessage -message "Creating audit logs volume : audit_logs"
# New-NcVol -Name audit_logs -Aggregate $DESTINATION_AGGREGATE_NAME -Size 5g -ErrorAction Stop | Select-Object -Property Name, State, TotalSize, Aggregate, Vserver
# logMessage -message "Volume audit_logs created successfully" -type "SUCCESS"
#}
## Mount audit logs volume to path /vol/audit_logs
#logMessage -message "Creating junction path for volume audit_logs at path /vol/audit_logs for vServer $DESTINATION_VSERVER"
#Mount-NcVol -VserverContext $DESTINATION_VSERVER -Name audit_logs -JunctionPath /audit_logs | Select-Object -Property Name, -JunctionPath
#logMessage -message "Created junction path for volume audit_logs at path /vol/audit_logs for vServer $DESTINATION_VSERVER" -type "SUCCESS"
#logMessage -message "Enabling audit logging for vServer $DESTINATION_VSERVER at path /vol/audit_logs"
#$command = "set -privilege advanced -confirmations off;vserver audit create -vserver $DESTINATION_VSERVER -destination /audit_logs -format xml;"
#Invoke-SSHCommand -SessionI $sshSession.SessionId -Command $command -ErrorAction Stop
#logMessage -message "Successfully enabled audit logging for vServer $DESTINATION_VSERVER at path /vol/audit_logs"
} catch {
handleError -errorMessage $_.Exception.Message
}
}