個人情報保護法に準拠するためのアクセス・ログとアクティビティ・レポートのマスク

この項のスクリプトを使用して、個人情報保護法に準拠するためにアクティビティ・レポートまたはアクセス・ログの情報をマスクするプロセスを自動化し、オプションで受信者にレポートを電子メールで送信します。

一部の国には厳格な個人情報保護法があるため、アクティビティ・レポートとアクセス・ログで使用可能な情報がサービス管理者に表示されないようにしてユーザーの個人情報を保護する必要があります。

anonymizeData.batを使用して、アクティビティ・レポートまたはアクセス・ログ内の情報をマスクして個人情報保護法に準拠し、オプションで電子メールで情報を送信します。情報をマスクするには、Windowsスケジューラを使用してこのスクリプトまたはバリエーションをスケジュールし、毎日各環境の日次メンテナンス・プロセスの完了後すぐに実行されるようにします。

次の情報ソースを使用します:

次の手順に示されているWindowsスクリプトをコピーしてanonymizeData.batを手動で作成し、Windowsスケジューラを使用してスケジュールします。スケジュールにWindowsを使用していない場合は、同様のプラットフォームに適したスクリプトを作成および実行できます。

anonymizeData.batは、次の手順で説明するように作成および更新する、anonymizeData.ps1スクリプトを実行するラッパー・スクリプトです。

使用するパスワードに特殊文字が含まれている場合は、特殊文字の処理を参照してください

  1. 次のスクリプトが含まれる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 %*
  2. 次のスクリプトが含まれる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
    
  3. Windowsスケジューラを使用して、anonymizeData.batをスケジュールします。詳細なステップは、スクリプトの実行の自動化を参照してください。
    次のパラメータ値を指定してanonymizeData.batを実行する必要があります
    • サービス管理者のユーザー名
    • サービス管理者のパスワードまたは暗号化されたパスワード・ファイルが使用可能な場所
    • アクセス・ログおよびアクティビティ・レポートをマスクするサービス環境のURL
    • オプション: レポートが送信される電子メール・アドレス。この値が指定されている場合のみ、レポートが電子メールで送信されます。