Oracle Database監査





こんにちは、ハブラチタテリ! 当然、従業員が行う仕事の有効性と品質を評価し、利益を増やし、コストを削減したいという各雇用主の要望。 ITインフラストラクチャのサポートは常にブラックボックスです。 まだ壊れていないので、支払われたお金はいくらですか? 問題を掘り下げようとするマネージャーはいない可能性が高いため、完了した作業、できれば毎日の作業に関するレポートがすぐに必要になる可能性が非常に高くなります。 美しい数字と細身のグラフィックスを考慮して、顧客は常に「味わう」。 次第に、監視インフラストラクチャ、バックアップのステータス、失敗したインシデント、およびDLPシステムの動作に関するレポートが表示されます。 そして、さらに、悪化します。 レポートは午前中に必要になるため、ITサポートの効率が低下し始め、チームの作業スケジュールが変更されています。 このプラクティスは、あなたがほとんど排他的にアクセスできるデータの迅速な提供の方向に、精神活動を信じられないほど刺激します。 この問題をさらに解決する方法を説明します。



レポートごとに報告する



顧客は、膨大な数の店舗と倉庫を持つ大規模な生産会社です。 彼はWindows環境でのOracleが大好きです(これは一般的にまれです)。 私たちは工場を考慮していません。私たちの目標は倉庫と店舗、そしてそこで回転しているすべてのDBMSです。



新しいDBMSインスタンスは開発者またはテスターに​​よって定期的に作成されることが知られています-テスト環境の存在を誰にも簡単に知らせることはできませんが、サーバーまたは別の仮想化のキャンセルにより誤って削除されるとパニックになります。 10年前にデータベースを備えたgodforsakenサーバーもあります。 店舗または倉庫はまだ彼らと協力しています。 拠点が(少なくとも地理的に)どこにあるか-顧客と監視システムを含めて誰も知りません。 これらのDBMSは、ここに入力されたことはありません。 すでに述べたように、Oracle DBMSのほとんどがWindows環境にデプロイされるという特異性があります。 Winインスタンスは既に約200であり、それらに関する情報を収集することは非常に困難です。 Linuxの下にもOracleがあります。 このようなデータベースは何もありません— 40個。別の深刻なプラスがあります-サーバーには場所による名前の規則があります:サーバーの名前を見つけ、その場所を見つけます。



PowerShellを使用してレポートを作成します。 なんで? のために:





Linuxホストにアクセスして情報を受信するには、Cygwinをインストールします。 これで、すべてのスクリプトとレポートが1か所にまとめられ、それは良いことです。 レポートの目的:DBMSの仮想環境への移行に関連して、Oracleデータベースセキュリティの長期監査が実行されます。



以下を決定する必要があります。





Linuxから始めましょう



何らかの理由で、ローカル開発者はそれらを恐れているため、すべてのDBMSが実稼働しています。 サーバーは既知であり、少数です。 Linuxホストのリストをスキャンして、ディレクトリ内の最終ファイルを取得します。 Oracleインスタンスを検索するには、シンプルな1行のbashスクリプトで実行中のPmonプロセスを探します。



スクリプト1:



for line in $(cat file.txt) do ssh oracle@$line '$(ps -e -o cmd | grep ora_pmon |grep -v grep|cut -c 10-19 > /tmp/result.txt) ; while read i ; do my_var=$(echo $i ); echo $(hostname -s)";"${my_var##*_}";;;"; done < /tmp/result.txt ; rm /tmp/result.txt' >>script_files/FileOra2.csv done
      
      





Windowsは私たちのすべてです



ここではPmonは見つかりません。Oracle全体が1つのマルチスレッドプロセスとして実装されています。 Windows管理インターフェイスを使用してWindowsホストをバイパスします。 OracleインスタンスはWindowsサービスにあります。 PowerShellを使用します。



スクリプト2



 $MLpath= 'c:\scripts\DBA\script_files\ML.txt' $MLdir= [System.IO.Path]::GetDirectoryName($MLPath) $outfile=$($MLdir +'\'+'FileOra.csv') $Dbfile= $($MLdir +'\'+'DBList.csv') $hosts=get-content $MLpath -Force $a= foreach ($pc in $hosts){ write-host "test $pc" try{ <#TO display gwmi -Class win32_service -computername "$pc"|where { $_.name -like "OracleService*" } -ErrorAction SilentlyContinue|format-table "$pc", name, state, pathname, StartMode -autosize|out-host#> $colItems = gwmi -Class win32_service -computername "$pc"|where { $_.name -like "OracleService*" } -ErrorAction SilentlyContinue foreach ($objItem in $colItems) {$($pc +";" +($objItem.name).trimstart("OracleService") +";" +$objitem.state +";" +$ObjITem.pathname +";" +$ObjITem.startmode) >> $outfile } } catch { Write-Output $("$pc" + $_.Exception.Message) } }
      
      





次は何ですか



ホストとデータベースのリストを収集すると、情報を更新するための最初の手順が実行されます。 まず、各DBMSで1人のユーザーを取得し、そこからさらにアクションを実行しました。 情報を収集する時です。 SQL * Plusを使用することも可能ですが、comオブジェクトを使用しているため、OLEDB for Oracleを使用することをお勧めします。 これを行うには、ターミナルにOLEDBプロバイダーをインストールし、各DBMSで必要な要求を実行します。 たとえば、オラクルの公式サイトからダウンロードできます。 OLEDBのシステム要件には、次のようなものがあります。



-Oracleデータベース(Oracle 9.2以降)へのアクセス

-Oracle Clientリリース11.1以上およびOracle Net Services(Oracle Provider for OLE DBインストールに含まれています)。



これで、サーバー上のオペレーティングシステムから抽象化できます。 コネクタを作成し、個別のデータベースでリクエストを実行して、結果をファイルに保存します。 ただし、スクリプト3を個別に使用して、空き領域の量、SGA、PGAパラメーター、ユーザーリスト、パスワードの暗号強度など、DBMSリストへの任意の要求を実行します(Oracleパスワードのハッシュはインターネットで簡単に見つけることができます)。 一部のクエリ文字はPowerShellでエスケープする必要があります。この場合、ASCIIエンコードテーブルから文字を返すOracle CHR関数を使用すると便利です。 また、出力では、詳細な分析のためにエラーコードで接続できなかったホストの個別のリストを取得します。



スクリプト3



 function Get-OLEDBData ($connectstring, $sql) { $OLEDBConn = New-Object System.Data.OleDb.OleDbConnection($connectstring) $OLEDBConn.open() $readcmd = New-Object system.Data.OleDb.OleDbCommand($sql,$OLEDBConn) $readcmd.CommandTimeout = '10' $da = New-Object system.Data.OleDb.OleDbDataAdapter($readcmd) $dt = New-Object system.Data.datatable [void]$da.fill($dt) $OLEDBConn.close() return $dt } $date=(get-date).toshortdatestring().replace("/",".") $log = "$("$date" +"_"+ 'error')" $db = "$("$date" +"_"+ 'DBlist')" $qry= 'select INSTANCE_NAME,HOST_NAME,VERSION from V$INSTANCE' gc c:\_tir\fileORA.csv| % { $row = $_.split(";") $hostname = $row[0] $service = $row[1] $connString = "password=xxxxXXXxxx;User ID=ORAUSER;Data Source=$hostname/$service;Provider=OraOLEDB.Oracle" try { Get-OLEDBData $connString $qry} catch {Write-Output $("$Compname" +';'+ $_.Exception.Message) >> C:\_tir\$log.log } }|Export-Csv c:\_tir\$db.csv -delim ';'
      
      





美をもたらす



テキストファイルはareいです。 カタログ内のすべての結果を日次Excelレポートに結合します。 Excelワークシートを通常のオブジェクトとして使用します。 操作が速くなるようにシートを非表示にします。 レポートをメールに送信します。 最後に、SQL * Plusを介してデータベースにさらに接続できるように、TNSNAMESファイルを更新します。 正しいファイル構文を使用します(覚えていません)。



スクリプト4



 $date=(get-date).toshortdatestring().replace("/",".") $MLpath= 'c:\scripts\DBA\script_files\ML.txt' $MLdir= [System.IO.Path]::GetDirectoryName($MLPath) $outfile=$($MLdir +'\'+'FileOra.csv') $Dbfile= $($MLdir +'\'+'DBList.csv') $Dbfilexls= $($MLdir +'\'+'DBList'+ $date +'.xlsx') #$logFile= [System.IO.Path]::Combine($MLdir,$("{0}.log" -f $sourceFileName )) gc $outfile|Sort-Object -Unique|out-file $Dbfile -Force <#creating excel doc#> $excel = new-object -comobject excel.application $excel.visible = $false $workbook = $excel.workbooks.add() $workbook.workSheets.item(3).delete() $workbook.WorkSheets.item(2).delete() $workbook.WorkSheets.item(1).Name = "Databases" $sheet = $workbook.WorkSheets.Item("Databases") $x = 2 $colorIndex = "microsoft.office.interop.excel.xlColorIndex" -as [type] $borderWeight = "microsoft.office.interop.excel.xlBorderWeight" -as [type] $chartType = "microsoft.office.interop.excel.xlChartType" -as [type] For($b = 1 ; $b -le 5 ; $b++) { $sheet.cells.item(1,$b).font.bold = $true $sheet.cells.item(1,$b).borders.ColorIndex = $colorIndex::xlColorIndexAutomatic $sheet.cells.item(1,$b).borders.weight = $borderWeight::xlMedium } $sheet.cells.item(1,1) = "Hostname" $sheet.cells.item(1,2) = "Instance" $sheet.cells.item(1,3) = "state" $sheet.cells.item(1,4) = "path" $sheet.cells.item(1,5) = "autorun" Foreach ($row in $data=Import-Csv $Dbfile -Delimiter ';' -Header name, value, path, state, start) { $sheet.cells.item($x,1) = $row.name $sheet.cells.item($x,2) = $row.value $sheet.cells.item($x,3) = $row.path $sheet.cells.item($x,4) = $row.state $sheet.cells.item($x,5) = $row.start $x++ } $range = $sheet.usedRange $range.EntireColumn.AutoFit() | Out-Null $Excel.ActiveWorkbook.SaveAs($Dbfilexls) if($workbook -ne $null) { $sheet = $null $range = $null $workbook.Close($false) } if($excel -ne $null) { $excel.Quit() $excel = $null [GC]::Collect() [GC]::WaitForPendingFinalizers() } IF(Test-Path $MLdir\tnsnames.ora ) { remove-item $MLdir\tnsnames.ora -Force } ELSE { Write-Host "new tnsora" } <# Update TNSORA file#> gc $Dbfile| % { $row = $_.split(";") $hostname = $row[0] $service = $row[1] $name=$service+'_'+$hostname "$name = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = $hostname)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = $service) ) )">> $MLdir\tnsnames.ora } <#Mail report to #> $filename= $Dbfilexls= $($MLdir +'\'+'DBList'+ $date +'.xlsx') $smtpServer = “server_name” $smtp = new-object Net.Mail.SmtpClient($smtpServer) $credentials=new-object system.net.networkcredential("server_name\mail","Dfgtnb451") $smtp.credentials=$credentials.getcredential($smtpserver,”25”,”basic”) $msg= New-Object net.Mail.MailMessage $att = new-object Net.Mail.Attachment($filename) $msg.from = “user@yourdomain.com” $msg.to.add(“timur@rrrr.xxx, valentin@rrrr.xxx”) $msg.subject = “Database_Report” $msg.body = "DAtabase report sample body" $msg.isbodyhtml= "false" $msg.Attachments.Add($att) $smtp.Send($msg)
      
      





スクリプトをWindowsスケジューラに追加することは残っています。 まず、LinuxおよびWindowsホスト上のOracleインスタンスに関する情報をそれぞれ収集します(1および2スクリプト)。 次に、各DBMSに接続して情報を収集します(スクリプト3)。 次に、集計されたExcelレポートを作成し、メールで送信します(スクリプト4)。



結論:彼らが戦ったもののために-彼らは何かに出くわした





良い自動化!



All Articles