delete from hateblo.jp where 1=1;

タイトルに意味はありません。

libvirt で GPU の仮想化を有効にしてみる

やりたいこと

libvirt仮想マシンを立てているが、GPU を使いたい

対象

インストール

0. KVM の インストールと設定

既にKVM環境を構築済みの場合はこの手順は不要です。

sudo apt install libvirt-daemon-system qemu-system

リモートからSSHで接続して virt-manager を設定できるようにする。

$ sudo vi /etc/libvirt/libvirtd.conf

# Listen for unencrypted TCP connections on the public TCP/IP port.
# ...
# This is disabled by default, uncomment this to enable it.
listen_tcp = 1

# Override the port for accepting insecure TCP connections
# This can be a port number, or service name
#
# This setting is not required or honoured if using systemd socket
# activation.
#
tcp_port = "16509"

あとは libvirt をリロードするだけ。

$ sudo systemctl reload libvirtd

Windows マシンで、 WSL2 が入っていたら、 virt-manager を使えるので、GUIで簡単に制御できる。

# WSL上で実行してください(debian系)
apt install virt-manager
# SSHキーを転送
ssh-keygen -t rsa -b 4096
ssh-copy-id example-username@example-hostname
# ログインできることを確認
ssh example-username@example-hostname
# virt-manager で接続する
virt-manager -c example-username@example-hostname

virt-manager

virt-managerGUIへ接続する場合は、 Display を VNC server と設定しないと、接続できません。(TLSを設定すればできるのですが、そこまでやっていません)

LINUX Kernel の設定

1. 環境確認

QEMUのバージョン確認(2.12以上)

$ qemu-system-x86_64 --version
QEMU emulator version 7.2.4 (Debian 1:7.2+dfsg-7+deb12u1)
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers
$  apt info qemu-system
Package: qemu-system
Version: 1:7.2+dfsg-7+deb12u1
Priority: optional
Section: otherosfs
Source: qemu
....

qemu が 2.12以上ならOK(最近のlinux ならほぼクリアしている)。

CPUの状態確認。

$ cat /proc/cpuinfo | grep model
model           : 94
model name      : Intel(R) Core(TM) i3-6100 CPU @ 3.70GHz

Intel 系でかつ、第5世代~第10世代であること。

2. kernel パラメータの調整 (IOMMU を有効化)

i915.enable_gvt=1 intel_iommu=on をパラメータに与える。

$ sudo vi /etc/default/grub
# GRUB_CMDLINE_LINUX=""
GRUB_CMDLINE_LINUX="i915.enable_gvt=1 i915.enable_guc=0 intel_iommu=on"

CPU が第10世代~第11世代の場合は次の資料で設定を確認して、必要に応じてオプションを追加すること。 wiki.archlinux.org

参考: オプションの種類を確認する方法

$ sudo modinfo i915 | grep -P "enable_gvt|enable_guc"
parm:           enable_guc:Enable GuC load for GuC submission and/or HuC load. Required functionality can be selected using bitmask values. (-1=auto [default], 0=disable, 1=GuC submission, 2=HuC load) (int)
parm:           enable_gvt:Enable support for Intel GVT-g graphics virtualization host support(default:false) (bool)

3. kernel モジュールのロード設定

kvmgt, vfio-iommu-type1, mdev を有効にする。

$ sudo vi /etc/modules-load.d/kvmgt.conf
# Load kvmgt, vfio-iommu-type1 and mdev
kvmgt

gvt を使っている時に出てくるエラーを無視する設定を行う。

$sudo vi  /etc/modprobe.d/kvm.conf
options kvm ignore_msrs=Y report_ignored_msrs=N

4. grub へ反映

grub の設定を行う。

※事前に /boot/grub/grub.cfg のバックアップを取得したほうが良いかも

$ sudo update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.1.0-12-amd64
Found initrd image: /boot/initrd.img-6.1.0-12-amd64
Found linux image: /boot/vmlinuz-6.1.0-10-amd64
Found initrd image: /boot/initrd.img-6.1.0-10-amd64
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
done

5. 再起動

再起動して、grub を反映する。

KVM の設定

6. KVM の hook 設定

必要なツールをインストール

# libxml2-utils は xmllint  のため、 uuid-runtime は uuidgen コマンドを使うため
$ apt install libxml2-utils uuid-runtime

libvirtd 用の hook を設定する。

$ sudo vi /etc/libvirt/hooks/qemu
#!/bin/sh

GVT_PCI="0000:00:02.0"
MDEV_TYPE=i915-GVTg_V5_4
GVT_GUID=`cat "/etc/libvirt/qemu/$1.xml" | xmllint --xpath 'string(/domain/devices/hostdev[@type="mdev"][@mode="subsystem"][@display][@model="vfio-pci"]/source/address/@uuid)' -`
# echo "$1 $2 $3 $GVT_GUID" >> /tmp/libvirt_gvthook
if [ $# -ge 3 ] && [ -n "$GVT_GUID" ]; then
#       echo gvt_ok >> /tmp/libvirt_gvthook
        if [ "$2" = "prepare" ] && [ "$3" = "begin" ]; then
                echo "$GVT_GUID" > "/sys/bus/pci/devices/$GVT_PCI/mdev_supported_types/$MDEV_TYPE/create"
        elif [ "$2" = "release" ] && [ "$3" = "end" ]; then
                echo 1 > "/sys/bus/pci/devices/$GVT_PCI/$GVT_GUID/remove"
        fi
fi

参考: 上記コードは以下を参考に作成しました。 wiki.archlinux.org

スティッキービットを設定して、root / root で実行されるようにする

# 念のため権限を設定
$ sudo chown root:root /etc/libvirt/hooks/qemu
# ユーザー・グループの権限で実行されるように設定
$ sudo chmod ug+s /etc/libvirt/hooks/qemu
# その他ユーザーに実行権限を付与
$ sudo chmod o+x /etc/libvirt/hooks/qemu
# 不用意に書き込み権を与えない
$ sudo chmod go-w /etc/libvirt/hooks/qemu
# 権限チェック
$ ls -l /etc/libvirt/hooks/qemu
-rwSr-Sr-x 1 root root 754 Sep 23 18:03 /etc/libvirt/hooks/qemu

VM の設定と起動

7. UEFI 起動を可能にする

ファームを適用する。

$ sudo apt install ovmf
# 設定を更新
$ sudo systemctl reload libvirtd

8. 対象の VM を設定する

次の設定で VM を設定する(必須)。

Archtecture: x86_64
Chipset: Q35
Firmware: UEFI x86_64: /usr/share/OVMF/OVMF_CODE_4M.ms.fd
  <os>
    <type arch="x86_64" machine="pc-q35-7.2">hvm</type>
    <loader readonly="yes" type="pflash">/usr/share/OVMF/OVMF_CODE_4M.ms.fd</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/{VMの名前}_VARS.fd</nvram>
    <boot dev="hd"/>
  </os>

注意: 起動対象の HDD(イメージ) は gpt でセキュアブートに対応していないといけません。 セキュアブートしていない場合は、GPUを一時的に認識しますが、使えない状態になります。(デバイスマネージャで警告状態となります)

9. GPUVM に設定する

virsh で接続して、手動でXMLを追加する。

$ uuidgen
875cd399-1c1b-47f0-8d7b-9f64023c1f56
$ virsh -c qemu:///system edit win10

以下の XML に追加する。

<hostdev mode="subsystem" type="mdev" managed="no" model="vfio-pci" display="off">
  <source>
    <address uuid="{uuidgenで生成した値をここに設定する}"/>
  </source>
  <alias name="hostdev0"/>
  <address type="pci" domain="0x0000" bus="0x00" slot="0x07" function="0x0"/>
</hostdev>

10. 対象のVMを起動する

正常に起動したら、Intel HD Graphics がデバイスドライバから参照できます。 また、タスクマネージャにGPUの項目が出れば、成功です。

なお、GPUメモリの関係で1台しか割り当たらないことがあります。

参考文献

lvmではないパーティションをオンライン拡張する(parted)

partedでlvmではないパーティションをオンライン拡張する

対象

手順

1. partedでパーティションを確認する

対象のデバイス(sda)は何らかの方法で特定しておくこと。

sudo parted /dev/sda
  help
  print

実行ログ:

user@debian:~$ sudo parted /dev/sda
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) help                                                             
  align-check TYPE N                        check partition N for TYPE(min|opt) alignment
  help [COMMAND]                           print general help, or help on COMMAND
  mklabel,mktable LABEL-TYPE               create a new disklabel (partition table)
  mkpart PART-TYPE [FS-TYPE] START END     make a partition
  name NUMBER NAME                         name partition NUMBER as NAME
  print [devices|free|list,all|NUMBER]     display the partition table, available devices, free space, all found
        partitions, or a particular partition
  quit                                     exit program
  rescue START END                         rescue a lost partition near START and END
  resizepart NUMBER END                    resize partition NUMBER
  rm NUMBER                                delete partition NUMBER
  select DEVICE                            choose the device to edit
  disk_set FLAG STATE                      change the FLAG on selected device
  disk_toggle [FLAG]                       toggle the state of FLAG on selected device
  set NUMBER FLAG STATE                    change the FLAG on partition NUMBER
  toggle [NUMBER [FLAG]]                   toggle the state of FLAG on partition NUMBER
  unit UNIT                                set the default unit to UNIT
  version                                  display the version number and copyright information of GNU Parted
(parted) print                                                            
Model: ATA SanDisk SD???????? (scsi)
Disk /dev/sda: 256GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system     Flags
 1      1049kB  17.2GB  17.2GB  primary  linux-swap(v1)
 2      17.2GB  34.4GB  17.2GB  primary
 3      34.4GB  172GB   137GB   primary  ext4
2. リサイズする

partedでディスクのサイズを拡張する。
終端サイズを指定するため、注意。あらかじめ、必要なサイズを計算すること。(実行ログでは32GBの拡張)
※「resizepart 3 204GB」では「parted: invalid token: 204GB」と言われてしまうので、次の手順とした

    resize 3
        yes
        204GB

実行ログ:

(parted) resizepart 3                                                     
Warning: Partition /dev/sda3 is being used. Are you sure you want to continue?
Yes/No? yes                                                               
End?  [172GB]? 204GB                                                      
(parted)                                                                  
3. リサイズ後の確認
    print
    quit

実行ログ:

(parted) print                                                            
Model: ATA SanDisk SD????????  (scsi)
Disk /dev/sda: 256GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system     Flags
 1      1049kB  17.2GB  17.2GB  primary  linux-swap(v1)
 2      17.2GB  34.4GB  17.2GB  primary
 3      34.4GB  204GB   170GB   primary  ext4

(parted) quit                                                             
Information: You may need to update /etc/fstab.

user@debian:~$ 
4. ファイルシステムのリサイズ

オンラインリサイズに対応しているファイルシステムに限ります。(今回はext3/ext4)
※xfsの場合はxfs_growfs

sudo resize2fs /dev/sda3 
df -h

実行ログ:

user@debian:~$ sudo resize2fs /dev/sda3 
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/sda3 is mounted on /vmfs/hdd; on-line resizing required
old_desc_blocks = 8, new_desc_blocks = 10
The filesystem on /dev/sda3 is now 41415823 (4k) blocks long.

user@debian:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/dm-0       440G   14G  404G   4% /
udev             10M     0   10M   0% /dev
tmpfs           6.3G  708M  5.6G  12% /run
tmpfs            16G  8.0K   16G   1% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs            16G     0   16G   0% /sys/fs/cgroup
/dev/sda3       156G  120G   29G  81% /vmfs/hdd
tmpfs           3.2G     0  3.2G   0% /run/user/1000

参考文献

Redmineをdockerで動かそう+サブディレクトリ

対象

  • redmineを動かしたい
  • host環境はできるだけ汚したくない→dockerで解決
  • 関連するサービスもdocker内で動かして、完結させたい→nginxを経由させる

対象外

以下については調査・検討中の事案につき、ここでは述べない

手順

Play with Docker dockerを一時的に動かして楽しめる環境があるので、そこで実験をした。
場所は任意ディレクトリで作業を行うこと。

docker-compose.yml

注意1:パスワード等は非常に脆弱なものを使用しているので、適切に修正すること。DBのパスワードを変更する場合は、後述の事前実行コマンド内の内容も変更すること。
注意2:play-with-dockerでviを使って以下のコマンドを貼り付けるとautoindentが効いてしまうので、「:set noautoindent」としてから貼り付けると幸せになる可能性がある。

version: '3.1'
services:
  redmine:
    image: redmine:3.4.2-passenger
    #ports:
    #  - "8080:3000"
    environment:
      REDMINE_DB_POSTGRES: db
      REDMINE_DB_PASSWORD: redmine
      REDMINE_DB_USERNAME: redmine
      REDMINE_DB_DATABASE: redmine
      RAILS_RELATIVE_URL_ROOT: /redmine
      #SMTP_USER: address@hoge.com
      #SMTP_PASS: password
#    restart: always
    depends_on:
      - adminer
    links:
      - db
    volumes:
      - /usr/src/redmine/files
      - ./redmine_config.ru:/usr/src/redmine/config.ru
  gitbucket:
    image: f99aq8ove/gitbucket
    environment:
      GITBUCKET_DB_URL: jdbc:postgresql://db/gitbucket
      GITBUCKET_DB_USER: gitbucket
      GITBUCKET_DB_PASSWORD: gitbucket
      JAVA_OPTS: -Xmx1g
      GITBUCKET_OPTS: --prefix=/gitbucket
    depends_on:
      - adminer
    volumes:
      - /gitbucket
    ports:
      - "29418:29418"
      #- "8418:8080"
    links:
      - db
  db:
    image: postgres:9.6-alpine
    environment:
      POSTGRES_PASSWORD: example
      POSTGRES_USER: work
    volumes:
      - /var/lib/postgresql/data
      - ./postgres_create_db_users.sql:/docker-entrypoint-initdb.d/create_db_users.sql:ro
  adminer:
    image: adminer
    ports:
      - "8000:8080"
    links:
      - db
    depends_on:
      - db
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx_reverseproxy.conf:/etc/nginx/nginx.conf:ro
    links:
      - redmine
      - gitbucket
     #for debug
     #command: [nginx-debug, '-g', 'daemon off;']
nginx_reverseproxy.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  20;

    gzip  on;

    #include /etc/nginx/conf.d/*.conf;

server {
    #server_name    localhost;
    listen 80;

    proxy_set_header    Host                $host;
    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    X-Forwarded-Host    $host;
    proxy_set_header    X-Forwarded-Server  $host;
    proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
    
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
         root   /usr/share/nginx/html;
    }
    
    location /gitbucket/ {
        proxy_pass    http://gitbucket:8080/gitbucket/;
    }

    #location /adminer/ {
    #    proxy_pass    http://adminer:8080/adminer/;
    #    #proxy_cookie_path /^/ /adminer/;
    #}
    location /redmine/ {
        proxy_pass    http://redmine:3000/redmine/;
    }

}

}
##TCP traffic will be proxied a proxied server
#server {
#    listen     29418;
#    proxy_pass gitbucket:29418;
#}
事前実行スクリプト
echo "CREATE USER redmine PASSWORD 'redmine';" >> postgres_create_db_users.sql
echo "CREATE DATABASE redmine;" >> postgres_create_db_users.sql
echo "GRANT ALL PRIVILEGES ON DATABASE redmine TO redmine;" >> postgres_create_db_users.sql

echo "CREATE USER gitbucket PASSWORD 'gitbucket';" >> postgres_create_db_users.sql
echo "CREATE DATABASE gitbucket;" >> postgres_create_db_users.sql
echo "GRANT ALL PRIVILEGES ON DATABASE gitbucket TO gitbucket;" >> postgres_create_db_users.sql


echo "require ::File.expand_path('../config/environment',  __FILE__)" > redmine_config.ru
echo "map ActionController::Base.config.relative_url_root || \"/\" do" >> redmine_config.ru
echo "    run Rails.application" >> redmine_config.ru
echo "end" >> redmine_config.ru
実行コマンド
# dockerを起動する
docker-compose up -d

# インスタンスをすべて削除する場合(volumeも削除しているので、注意)
docker-compose stop
docker-compose rm -v

# 一部インスタンスに対する操作の場合(以下の例は、起動中のサービスを停止し、設定を変更して実行する)
docker-compose stop nginx
docker-compose rm -v nginx
vi nginx_reverseproxy.conf
docker-compose up -d nginx

# 問題が起きた場合はログを確認する (例:nginxの場合で、起動ログに出力されているホスト名を参照する)
docker-compose logs | grep nginx_1

tips

上記スクリプトを作成するにあたっての注意点など

DBへの初期データ投入

/docker-entrypoint-initdb.d 配下に*.sql、*.shを配置すると、DB初期化時に初期データを投入してくれる。
host側のsqlをコンテナ内とリンク(ro:読み取り専用)して、実行されるようにする。

docker-compose logs | grep db_1

db_1         | waiting for server to shut down....LOG:  received fast shutdown request
db_1         | LOG:  aborting any active transactions
db_1         | LOG:  autovacuum launcher shutting down
db_1         | LOG:  shutting down
db_1         | LOG:  database system is shut down
db_1         |  done
db_1         | server stopped
db_1         |
db_1         | PostgreSQL init process complete; ready for start up.
db_1         |
db_1         | LOG:  database system was shut down at 2017-09-22 16:30:08 UTC
db_1         | LOG:  MultiXact member wraparound protections are now enabled
db_1         | LOG:  database system is ready to accept connections
db_1         | LOG:  autovacuum launcher started

上記のように、DBがいったんシャットダウンしているように見えるが、正常である。
正常であるかどうかを確認するには、「PostgreSQL init process complete; ready for start up.」が出力されていることを確認しよう。
もし、問題がある場合は、上記のログより前に、実行ログが出力されるので、その内容を確認すること。

サブディレクトリの設定

config.ruを書き換えるのと、RAILS_RELATIVE_URL_ROOTの環境変数を設定する。
config.ruは調べる限り、変更が発生することが少ないので、上書き適用しても問題ないと考えた。
また、イメージはpassengerを使う構成になっていないといけない。

adminerはDBのメンテナンスツール。必要に応じて使う機能であるため、nginxからの参照はやめて、ポートマッピングで対応することにした。(シンボリックリンクや、Dockerfileに手を入れることも考えたが、単純なコマンドで対応することができないため、あきらめた。)

改変履歴

  • 2017/09/29
    • nginxのredmineポート指定の誤りを修正

Visual Studio Express のダウンロード

対象

以下のことをやりたい人向けの手順です。

  • Visual Studio 2015 Express をダウンロードしたい
  • オフラインパッケージを準備したい

Microsoftのサイト構成はコロコロ変わるので、数日したら時代遅れになっている可能性があります。

ダウンロード手順

  1. Visual Studio Express | Now Visual Studio Communityへアクセスする
  2. それでも Visual Studio Express を希望されますか?から「Express 2015 for Windows Desktop」を選択する
  3. そのままダウンロードページへ移動するが、ダウンロードを継続せずにURLを確認する
  4. 0x409→0x411へ変更し、そのURLへアクセスする

オフラインパッケージ準備手順

インストーラの言語に引きずられるので、ファイル名にJPNが入っていることを確認してから実施すること。

  1. ダウンロードしたexeのディレクトリをコマンドプロンプトで開く
  2. exeの引数を「 /layout」とし、実行する
  3. ウィザードに従って関連するファイルが一式ダウンロードされる

なお、ダウンロードしたファイルであってもオンラインへアクセスしに行く。
(防ぎたい場合はダウンロード済みのセットアップコマンドラインで「/NoRefresh /noweb」などを指定してください)

メモ

言語の変更

誤って英語版をインストールしてしまった場合は、再度インストーラを実行すれば、日本語パッケージのみのインストールが行われる。
Visual Studio 2015 言語パッケージ(日本語)が存在するが、これは、Professional等のライセンス版のみ。Expressは潔くインストーラを実行しよう。

メディアの作成

オフラインパッケージはISOファイルにならないので、手動でメディアを作成する必要があるが、全体容量が8Gを超えるため、DVD-R DL等でも入らない。
WDK10のシリーズを消して収める等考えないといけない。

System.Data.SQLite の暗号化について

対象

  • .NET Framework
  • SQLiteを組み込もうとしている
  • パスワードを設定しようとしている

調査内容

SQLiteでパスワードを設定した場合、暗号化される。
その暗号化っていったい何者で、どうやって暗号化しているのか。

結果

WinCryptを使用して、RSA-SHA1-RC4で暗号化している。
暗号化しているのはB-Treeページ単位で、それぞののページの読み書きを行うときに呼び出されているように見える。
SQLite.Interop/src/win/crypt.c:InitializeProvider()

参考文献

特定のDLLのダイナミックロードに関する調査資料

対象

結果

現在のドメイン(AppDomain)を汚染せずに(Assemblyにロードしない状態を維持しながら)Assemblyロードするのは現実的ではない。
そのため、プロセスの分離(WCF)など方式を検討すべきである。

理由は、例外発生時に、別AppDomain上にロードされている情報が、主ドメインにロードされてしまうため。(*.pdbが存在する場合)

*.pdbの生成を抑止すれば、上記問題の発生を抑止することができるが、トレース情報が出力されないため、やりたいことが実現できなくなってしまう。
また、DLLをアプリの検索パス以外に配置した場合、動的ロードできないことが判明している。(Assembly.Loadならいける)

参考資料

監査

監査って何をするのか、そもそも不明なので、独断と偏見でまとめる。(間違っていることが多いので、参考文献を参照すること)

監査とは

目的を確認し、目的を守れていることを検証する。

検証すること
  • 不正が発生することを抑止する(相互牽制:ダブルチェック)
    • 作成者と承認者を分けることで、チェックを行う
  • 過失が発生することを抑止する
    • ミスを即座に検知できること
  • 誤りが発生した場合修正できるようにすべき
    • ミスを訂正できることを確認
検証する対象の分類
  • 監査人の立場における分類
    • 内部監査
    • 外部監査
  • 監査対象における分類
    • 業務監査
    • 会計監査
    • システム監査
    • IT監査
  • 目的における分類

監査の流れ

監査計画→監査実施→報告→フォロー というPDCAの流れで行う。

監査計画
  • 中長期計画
    • 事業計画に基づくもの等
  • 基本計画
    • いつやるかなど
    • 何をやるのか(監査対象)
    • 体制
  • 個別計画
監査実施
  • 事前調査・予備調査
    • 監査要点(観点)を策定(以下は会計監査から引用しているがこれらと似たものが必要と考えられる)
      • 実在性
      • 網羅性
      • 権利と義務の帰属
      • 評価の妥当性
      • 期間配分の適切性
      • 表示の妥当性
    • 監査対象の資料を集める
    • 監査手続き
      • 監査証拠の能力を高める方法を決める
      • どのような手段で入手し、何を確認するのか
      • 監査要点の立証方法を決める
  • 本調査
    • 監査資料と実際の機能をチェックする -- 監査手続き
    • 資料との一致を確認
    • 監査証拠を集める
  • 評価
    • 監査調書作成
      • 事実のみを記載する
      • あくまでも改善のための元ネタであり、ここに善悪・改善は書かない

監査報告

  • リスクの漏れを報告
    • ヒヤリング結果
  • リスクに対するコントロールができていないものの報告
  • 本当にコントロールできているのか
    • 監査証拠をもとに述べる

フォローアップ

監査報告した内容を取り込んだ結果の効果をみる