この項のスクリプトを使用して、個人情報保護法に準拠するためにアクティビティ・レポートまたはアクセス・ログの情報をマスクするプロセスを自動化し、オプションで受信者にレポートを電子メールで送信します。
一部の国には厳格な個人情報保護法があるため、アクティビティ・レポートとアクセス・ログで使用可能な情報がサービス管理者に表示されないようにしてユーザーの個人情報を保護する必要があります。
anonymizeData.batを使用して、アクティビティ・レポートまたはアクセス・ログ内の情報をマスクして個人情報保護法に準拠し、オプションで電子メールで情報を送信します。情報をマスクするには、Windowsスケジューラを使用してこのスクリプトまたはバリエーションをスケジュールし、毎日各環境の日次メンテナンス・プロセスの完了後すぐに実行されるようにします。
次の情報ソースを使用します:
次の手順に示されているWindowsスクリプトをコピーしてanonymizeData.batを手動で作成し、Windowsスケジューラを使用してスケジュールします。スケジュールにWindowsを使用していない場合は、同様のプラットフォームに適したスクリプトを作成および実行できます。
anonymizeData.batは、次の手順で説明するように作成および更新する、anonymizeData.ps1スクリプトを実行するラッパー・スクリプトです。
使用するパスワードに特殊文字が含まれている場合は、特殊文字の処理を参照してください
anonymizeData.batという名前のバッチ(BAT)ファイルを作成し、C:\automate_scriptsなどのわかりやすい場所に保存します。
@echo off set paramRequiredMessage=Syntax: anonymizeData.bat USERNAME PASSWORD/PASSWORD_FILE URL [EMAIL_TO_ADDRESS] if "%~1" == "" ( echo User Name is missing. echo %paramRequiredMessage% exit /b 1 ) if "%~2" == "" ( echo Password or Password_File is missing. echo %paramRequiredMessage% exit /b 1 ) if "%~3" == "" ( echo URL is missing. echo %paramRequiredMessage% exit /b 1 ) PowerShell.exe -File anonymizeData.ps1 %*
anonymizeData.ps1という名前のPowerShellスクリプト(PS1)ファイルを作成し、C:\automate_scriptsなどのわかりやすい場所に保存します。
# Anonymize data script
$username=$args[0]
$password=$args[1]
$url=$args[2]
$emailtoaddress=$args[3]
# Generic variables
$date=$(get-date -f dd_MM_yy_HH_mm_ss)
$datedefaultformat=$(get-date)
$logdir="./logs/"
$logfile="$logdir/anonymize-data-" + $date + ".log"
$filelist="filelist.txt"
function LogMessage
{
$message=$args[0]
echo "$message" >> $logfile
}
function EchoAndLogMessage
{
$message=$args[0]
echo "$message"
echo "$message" >> $logfile
}
function Init
{
$logdirexists=Test-Path $logdir
if (!($logdirexists)) {
mkdir $logdir 2>&1 | out-null
}
$logfileexists=Test-Path $logfile
if ($logfileexists) {
rm $logfile 2>&1 | out-null
}
$filelistexists=Test-Path $filelist
if ($filelistexists) {
rm $filelist 2>&1 | out-null
}
}
function ProcessCommand
{
$op=$args
echo "EPM Automate operation: epmautomate.bat $op" >> $logfile
if ($op -eq 'listfiles') {
epmautomate.bat $op | where {$_ -like ' apr/*/access_log.zip'} | Tee-Object -FilePath $filelist | Out-File $logfile -Append 2>&1
} else {
epmautomate.bat $op >> $logfile 2>&1
if ($LASTEXITCODE -ne 0) {
echo "EPM Automate operation failed: epmautomate.bat $op. See $logfile for details."
#exit
}
}
}
function RunEpmAutomateCommands
{
EchoAndLogMessage "Running EPM Automate commands to anonymize data in the access logs and activity reports."
ProcessCommand login $username $password $url
ProcessCommand listfiles
ProcessFiles
ProcessCommand logout
}
function ProcessActivityReport
{
$activityreport=$args[0]
$user=$args[1]
$activityreportexists=Test-Path "$activityreport"
if ($activityreportexists) {
LogMessage "Removing User ID: $user from activity report $activityreport"
(Get-Content "$activityreport").replace("$user", 'XXXXX') | Set-Content "$activityreport"
$txt = [io.file]::ReadAllText("$activityreport") -replace "`r`n","`n"
[io.file]::WriteAllText("$activityreport", $txt)
#Get-ChildItem -File -Recurse | % { $x = get-content -raw -path $activityreport; $x -replace "`r`n","`n" | set-content -path $activityreport }
}
}
function AnonymizeData
{
$aprdir=$args[0]
$datestampdir=$args[1]
$path="$aprdir/$datestampdir"
$accesslogzipped="access_log.zip"
$accesslog="access_log.csv"
$accesslogupdated=$accesslog + ".tmp"
$activityreportfile="$datestampdir" + ".html"
$userArray = @()
expand-Archive -Path "$path/$accesslogzipped" -DestinationPath $path
rm $path/$accesslogzipped 2>&1 | out-null
$accesslogexists=Test-Path "$path/$accesslog"
if ($accesslogexists) {
EchoAndLogMessage "Processing access log: $path/$accesslog"
Get-Content $path/$accesslog | ForEach-Object {
$elements=[regex]::Split( $_ , ',(?=(?:[^"]|"[^"]*")*$)' )
$date=$elements[0]
$time=$elements[1]
$uri=$elements[2]
$duration=$elements[3]
$bytes=$elements[4]
$ip=$elements[5]
$user=$elements[6]
$screen=$elements[7]
$action=$elements[8]
$object=$elements[9]
if ($date -like 'Date') {
echo "$_" >> $path/$accesslogupdated
} else {
if ($user -notlike '-') {
LogMessage "Removing instance of User ID: $user from $path/$accesslog."
echo "$date,$time,$uri,$duration,$bytes,$ip,XXXXX,$screen,$action,$object" >> $path/$accesslogupdated
$userArray += $user
} else {
echo "$date,$time,$uri,$duration,$bytes,$ip,$user,$screen,$action,$object" >> $path/$accesslogupdated
}
}
}
#Get-ChildItem -File -Recurse | % { $x = get-content -raw -path $path/$accesslogupdated; $x -replace "`r`n","`n" | set-content -path $path/$accesslogupdated }
$txt = [io.file]::ReadAllText("$path/$accesslogupdated") -replace "`r`n","`n"
[io.file]::WriteAllText("$path/$accesslogupdated", $txt)
mv -Force $path/$accesslogupdated $path/$accesslog
Compress-Archive -Path $path/$accesslog $path/$accesslogzipped
rm $path/$accesslog 2>&1 | out-null
}
EchoAndLogMessage "Processing activity report: $path/$activityreportfile"
$userArray = $userArray | Select-Object -Unique
foreach ($element in $userArray) {
ProcessActivityReport "$path/$activityreportfile" "$element"
}
}
function ProcessFiles
{
# Loop through iteration csv file and parse
Get-Content $filelist | ForEach-Object {
$fullpath=$_.trim()
$elements=$fullpath.split('/')
$aprdir=$elements[0]
$datestampdir=$elements[1]
$accesslogfile="access_log.zip"
$activityreportfile="$datestampdir" + ".html"
$datestampdirexists=Test-Path "$aprdir/$datestampdir"
$accesslog="$aprdir/$datestampdir/$accesslogfile"
$activityreport="$aprdir/$datestampdir/$activityreportfile"
echo "fullpath: $fullpath" >> $logfile
echo "aprdir: $aprdir, datestampdir: $datestampdir" >> $logfile
if (!($datestampdirexists)) {
mkdir "$aprdir/$datestampdir" -ea 0 2>&1 | out-null
ProcessCommand downloadfile "$accesslog"
ProcessCommand downloadfile "$activityreport"
mv "$accesslogfile" "$aprdir/$datestampdir"
mv "$activityreportfile" "$aprdir/$datestampdir"
AnonymizeData "$aprdir" "$datestampdir"
ProcessCommand deletefile "$accesslog"
ProcessCommand deletefile "$activityreport"
ProcessCommand uploadfile "$accesslog" "$aprdir/$datestampdir"
ProcessCommand uploadfile "$activityreport" "$aprdir/$datestampdir"
} else {
EchoAndLogMessage "Files in directory $aprdir/$datestampdir were processed earlier. Skipping these files."
}
}
}
function callSendMail
{
$elements=$logfile.split('/')
$logfilename=$elements[3]
if (${emailtoaddress} -match "@") {
epmautomate.bat login ${username} ${password} ${url}
epmautomate.bat uploadFile "$logfile"
epmautomate.bat sendMail $emailtoaddress "Mask Access Logs and Activity Reports results" Body="The results of running the Mask Access Logs and Activity Reports script are attached." Attachments=$logfilename
epmautomate.bat deleteFile "$logfilename"
epmautomate.bat logout
}
}
Init
EchoAndLogMessage "Starting the anonymize data script"
RunEpmAutomateCommands
EchoAndLogMessage "Anonymize data script completed"
EchoAndLogMessage "Refer to logfile: $logfile for details."
callSendMail
anonymizeData.batをスケジュールします。詳細なステップは、スクリプトの実行の自動化を参照してください。
anonymizeData.batを実行する必要があります