Windows用のファイル転送ツールであるRobocopyコマンドには、バックアップモード(/B
オプション)が存在します。NTFSでは、管理者(administrator
)ユーザーであっても、フォルダーやファイルに対するアクセス許可がなければ、ファイルを読み取ることはできません。Robocopyも通常はこの制約を受けるのですが、バックアップモードであればRobocopyの実行ユーザーにファイルのアクセス許可がなくても、コピー可能です。
Robocopyを実行するWindows上のユーザーアカウントは、Administrators
グループかBackup Operators
グループのいずれかに所属する必要があります。検証段階ではAdministrators
グループでもよいのですが、本番用途としては権限を絞りたいところです。そこで、バックアップモードに必要な最小権限を探ることにしました。
なお、この記事におけるRobocopyは、Windows Server 2019に標準搭載されたRobocopy(バージョン 10.0.17763.4010)を前提としています。
バックアップモードの検証環境
今回用意した検証環境は、以下のとおりです。
- Robocopyのコピー元フォルダーは、Active Directoryにドメイン参加したWindows Server 2019(コピー元サーバー)上のローカルフォルダー
- ローカルフォルダーにはダミーファイルを100個作成済み
- Robocopyは、コピー元サーバーから私のActive Directoryのユーザーアカウントとして実行
- Robocopyのコピー先フォルダーは、Active Directoryにドメイン参加したWindows Server 2019(コピー先サーバー)上の共有フォルダー
- 共有アクセス権は、Robocopyを実行するユーザーアカウントに対して、いろいろと権限を変更して検証
- Robocopyのオプションは、
*.* /NDL /NFL /S /E /COPYALL /PURGE /MIR /B /NP /XJ /R:0 /W:0
- Robocopyを実行するコマンド プロンプトは、管理者として実行
ユーザー・共有権限と実行結果の関係
コピー元サーバー:Administratorsグループ
「読み取り」共有アクセス権
まずは、Administrators
グループに所属するアカウントで、バックアップモードが利用できることを確認してみます。コピー元のサーバーで「ローカル ユーザーとグループの編集」を起動し、Administrators
グループに私のユーザーアカウントを登録しました。
Robocopyが失敗するのは明らかですが、トラブルシューティングに役立つ可能性があるため、コピー先フォルダーの共有アクセス権は「読み取り」権限だけに設定して、Robocopyを実行しました。なお、ログをファイルに出力する場合は、Robocopyを実行したアカウントが書き込み可能な場所を指定する必要があります。
-------------------------------------------------------------------------------
ROBOCOPY :: Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------
開始: 2023年6月29日 13:40:00
コピー元 : E:\dummydata1\
コピー先 : \\XXXXXXXXXX\Robocopy-test\dummydata1\
(略)
オプション: *.* /NDL /NFL /S /E /COPYALL /PURGE /MIR /B /NP /XJ /R:0 /W:0
------------------------------------------------------------------------------
2023/06/29 13:40:01 エラー 5 (0x00000005) コピー先ディレクトリにアクセスしています \\XXXXXXXXXX\Robocopy-test\dummydata1\
アクセスが拒否されました。
コピー先に対して読み取りしかできない場合、エラーメッセージは想定どおり「アクセスが拒否されました」になりました。
「変更」共有アクセス権
次の段階として、コピー先フォルダーの共有アクセス権に「読み取り」権限だけではなく「変更」権限も追加してから、Robocopyを実行してみました。
-------------------------------------------------------------------------------
ROBOCOPY :: Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------
開始: 2023年6月29日 14:00:00
コピー元 : E:\dummydata1\
コピー先 : \\XXXXXXXXXX\Robocopy-test\dummydata1\
(略)
オプション: *.* /NDL /NFL /S /E /COPYALL /PURGE /MIR /B /NP /XJ /R:0 /W:0
------------------------------------------------------------------------------
2023/06/29 14:00:00 エラー 5 (0x00000005) NTFS セキュリティをコピー先ディレクトリにコピーしています \\XXXXXXXXXX\Robocopy-test\dummydata1\
アクセスが拒否されました。
「変更」権限を追加しただけでは、NTFSセキュリティ(アクセス許可情報、所有者情報、監査情報)のコピーができずに、「アクセスが拒否されました」でエラーとなりました。
「フル コントロール」共有アクセス権
さらに進めて、コピー先フォルダーの共有アクセス権に「フル コントロール」権限を追加して、Robocopyを実行してみました。
-------------------------------------------------------------------------------
ROBOCOPY :: Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------
開始: 2023年6月29日 14:20:00
コピー元 : E:\dummydata1\
コピー先 : \\XXXXXXXXXX\Robocopy-test\dummydata1\
(略)
オプション: *.* /NDL /NFL /S /E /COPYALL /PURGE /MIR /B /NP /XJ /R:0 /W:0
------------------------------------------------------------------------------
2023/06/29 14:20:01 エラー 1314 (0x00000522) NTFS セキュリティをコピー先ディレクトリにコピーしています \\XXXXXXXXXX\Robocopy-test\dummydata1\
クライアントは要求された特権を保有していません。
エラーメッセージは「クライアントは要求された特権を保有していません」に変化しましたが、NTFSセキュリティのコピーで失敗する状況は変わりませんでした。
コピー先サーバー:Backup Operatorsグループ
バックアップモードで「アクセスが拒否されました」と表示されるケースについて調べたところ、コピー先サーバーでもRobocopyを実行するアカウントに対してSeBackupPrivilege
ユーザー権利が必要なようでした。
Windows Serverに限らずWindowsでは、OSの機能のうち何を利用できるかが、アカウントに応じて決められています。この利用できるWindows OSの機能のことを「ユーザー権利」と呼び、ユーザー権利に対応するポリシーごとに割り当てられたユーザーやグループは、以下の手順で確認することができます。
- Windowsで「ローカル セキュリティ ポリシー」を起動
- 左ペインで、「セキュリティの設定」、「ローカル ポリシー」、「ユーザー権利の割り当て」の順でオープン
- 右ペインに、ポリシーが割り当てられたユーザーやグループ(セキュリティの設定)とともに一覧が表示
別の情報 ⧉によれば、コピー元サーバーでRobocopyを実行するアカウントにSeBackupPrivilege
ユーザー権利(「ファイルとディレクトリのバックアップ」ポリシー)とSeRestorePrivilege
ユーザー権利(「ファイルとディレクトリの復元」ポリシー)を割り当てないと、バックアップモードが利用できないそうです。ローカル セキュリティ ポリシーで、これらのユーザー権利が割り当てられたユーザーやグループを確認すると、確かにAdministrators
とBackup Operators
が設定されています。
そこで、コピー先サーバーでも「ローカル ユーザーとグループの編集」を起動して、まずはBackup Operators
グループに私のアカウントを追加しました。この状態でRobocopyを実行したところ、以下のようにファイルコピーが成功しました。
-------------------------------------------------------------------------------
ROBOCOPY :: Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------
開始: 2023年6月29日 14:45:01
コピー元 : E:\dummydata1\
コピー先 : \\XXXXXXXXXX\Robocopy-test\dummydata1\
(略)
オプション: *.* /NDL /NFL /S /E /COPYALL /PURGE /MIR /B /NP /XJ /R:0 /W:0
------------------------------------------------------------------------------
------------------------------------------------------------------------------
合計 コピー済み スキップ 不一致 失敗 Extras
ディレクトリ: 1 0 1 0 0 0
ファイル: 100 100 0 0 0 0
バイト: 100.00 m 100.00 m 0 0 0 0
時刻: 0:00:48 0:00:48 0:00:00 0:00:00
速度: 2182987 バイト/秒
速度: 124.911 MB/分
終了: 2023年6月29日 14:45:50
ちなみに、この状態からコピー先フォルダーの共有アクセス権を「読み取り」と「変更」に戻したところ、「アクセスが拒否されました」のエラーメッセージでコピーが失敗しました。
コピー先サーバー:SeBackupPrivilegeユーザー権利
Backup Operators
グループにアカウントを追加すると、SeBackupPrivilege
やSeRestorePrivilege
のユーザー権利以外にも、さまざまな権限が付与されます。しかし、コピー先サーバーが異なる体制で管理されているケースでは、追加で付与された権限が懸念されるかもしれません。「ユーザー権利の割り当て」のドキュメント ⧉を見る限り、システムのシャットダウン(SeShutdownPrivilege
ユーザー権利)を除けば問題なさそうですが、本来はSeBackupPrivilege
ユーザー権利の付与だけで済むはずで、そちらの方が「最小権限の原則」的にも望ましいでしょう。
そこで、コピー先サーバーのBackup Operators
グループから除外して、代わりにSeBackupPrivilege
ユーザー権利に割り当てた状態で、Robocopyを実行することにします。
ユーザー権利に割り当てるユーザーやグループは、以下の手順で変更することができます。
- Windowsで「グループ ポリシーの編集」を起動
- 左ペインで、「ローカル コンピューター ポリシー」、「コンピューターの構成」、「Windows の設定」、「セキュリティの設定」、「ローカル ポリシー」、「ユーザー権利の割り当て」の順でオープン
- 設定を変更したいポリシー(今回の場合は、「ファイルとディレクトリのバックアップ」)をクリック
- 「ローカル セキュリティの設定」タブから「ユーザーまたはグループの追加」をクリックして、Robocopyを実行するアカウントを追加
- 「OK」をクリックして、ポリシーのプロパティをクローズ
- コマンド プロンプトを起動し、
gpupdate
コマンドを引数なしで実行して、変更したグループ ポリシーを手動適用
上記の手順で権限を変更した後に、Robocopyを実行した結果は以下のとおりになりました。
-------------------------------------------------------------------------------
ROBOCOPY :: Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------
開始: 2023年6月30日 19:46:03
コピー元 : E:\dummydata1\
コピー先 : \\XXXXXXXXXX\Robocopy-test\dummydata1\
(略)
オプション: *.* /NDL /NFL /S /E /COPYALL /PURGE /MIR /B /NP /XJ /R:0 /W:0
------------------------------------------------------------------------------
2023/06/30 19:46:04 エラー 1307 (0x0000051B) NTFS セキュリティをコピー先ディレクトリにコピーしています \\XXXXXXXXXX\Robocopy-test\dummydata1\
このセキュリティ ID はこのオブジェクトの所有者として割り当てられていない可能性があります。
------------------------------------------------------------------------------
合計 コピー済み スキップ 不一致 失敗 Extras
ディレクトリ: 1 1 0 0 0 0
ファイル: 0 0 0 0 0 0
バイト: 0 0 0 0 0 0
時刻: 0:00:00 0:00:00 0:00:00 0:00:00
終了: 2023年6月30日 19:46:04
「このセキュリティ ID はこのオブジェクトの所有者として割り当てられていない可能性があります」で、ファイルのコピーが失敗しました。なお、コピー対象のフォルダーdummydata1
だけはコピー先サーバーにコピーできていました。
コピー先サーバー:SeBackupPrivilegeおよびSeRestorePrivilegeユーザー権利
試しに、コピー先サーバーではSeBackupPrivilege
ユーザー権利だけではなく、SeRestorePrivilege
ユーザー権利も追加で付与してみます。コピー先サーバーで「グループ ポリシーの編集」を起動して、今度は「ファイルとディレクトリの復元」ポリシーに私のアカウントを追加しました。
-------------------------------------------------------------------------------
ROBOCOPY :: Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------
開始: 2023年6月30日 19:55:00
コピー元 : E:\dummydata1\
コピー先 : \\XXXXXXXXXX\Robocopy-test\dummydata1\
(略)
オプション: *.* /NDL /NFL /S /E /COPYALL /PURGE /MIR /B /NP /XJ /R:0 /W:0
------------------------------------------------------------------------------
------------------------------------------------------------------------------
合計 コピー済み スキップ 不一致 失敗 Extras
ディレクトリ: 1 1 0 0 0 0
ファイル: 100 100 0 0 0 0
バイト: 100.00 m 100.00 m 0 0 0 0
時刻: 0:00:49 0:00:49 0:00:00 0:00:00
速度: 2138249 バイト/秒
速度: 122.351 MB/分
終了: 2023年6月30日 19:55:50
Robocopyを実行したところ、すべてのファイルがコピーされました。これにより、コピー先サーバーではRobocopyを実行するアカウントに対してSeBackupPrivilege
とSeRestorePrivilege
のユーザー権利があれば十分なことがわかりました。
コピー元サーバー:Backup Operatorsグループ
コピー先サーバーで必要だった最小権限が判明したので、今度はコピー元サーバーに戻ってRobocopyを実行するアカウントに必要な権限を探っていきます。まずは、コピー元サーバーで「ローカル ユーザーとグループの編集」を起動して、私のアカウントが所属するグループをBackup Operators
に変更してみました。この状態でRobocopyを実行して、ファイルコピーが成功するかどうか確認してみます。
-------------------------------------------------------------------------------
ROBOCOPY :: Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------
開始: 2023年10月18日 14:51:46
コピー元 : E:\dummydata1\
コピー先 : \\XXXXXXXXXX\Robocopy-test\dummydata1\
(略)
オプション: *.* /NDL /NFL /S /E /COPYALL /PURGE /MIR /B /NP /XJ /R:0 /W:0
------------------------------------------------------------------------------
エラー: 監査管理のユーザー権利がありません。
***** 監査情報をコピーするにはこれが必要です (/COPY:U または /COPYALL)。
「監査管理のユーザー権利がありません」でエラーとなりました。さらに、エラーメッセージには/COPY:U
または/COPYALL
(=/COPY:DATSOU
)のオプションを指定して、Robocopyを実行するには監査管理のユーザー権利が必要とあります。
この/COPY:copyflag
とは、ファイルやフォルダーのどの項目をコピーするか指定するオプションです。copyflag
には、以下のDATSOU
の文字の組み合わせの中から、コピーする項目を選択します。
copyflag | 項目 | 説明 |
---|---|---|
D | データ | ファイルのデータ(代替データストリームも含む) |
A | 属性 | ファイルの属性(read-only、hidden、system、archiveなど) |
T | タイム スタンプ | ファイルのタイム スタンプ |
S | NTFS アクセス制御リスト(ACL) | NTFSのアクセス許可情報。「セキュリティ情報」と呼ばれることもある |
O | 所有者情報 | NTFSの所有者情報 |
U | 監査情報 | NTFSの監査情報 |
監査情報(U
)をコピーするにはユーザー権利が不足しているようなので、逆に監査情報以外のすべての項目をコピーするように指定したら、Robocopyの結果はどうなるでしょうか。
-------------------------------------------------------------------------------
ROBOCOPY :: Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------
開始: 2023年10月18日 15:00:50
コピー元 : E:\dummydata1\
コピー先 : \\XXXXXXXXXX\Robocopy-test\dummydata1\
(略)
オプション: *.* /NDL /NFL /S /E /DCOPY:DAT /COPY:DATSO /PURGE /MIR /B /NP /XJ /R:0 /W:0
------------------------------------------------------------------------------
------------------------------------------------------------------------------
合計 コピー済み スキップ 不一致 失敗 Extras
ディレクトリ: 1 1 0 0 0 0
ファイル: 100 100 0 0 0 0
バイト: 100.00 m 100.00 m 0 0 0 0
時刻: 0:00:42 0:00:42 0:00:00 0:00:00
速度: 2494946 バイト/秒
速度: 142.761 MB/分
終了: 2023年10月18日 15:01:32
ファイルを問題なくコピーすることができました。やはり、Robocopyがファイルの監査情報をコピーしようとすると、エラーになるようです。
コピー元サーバー: SeSecurityPrivilegeユーザー権利の追加
Administrators
グループには割り当てられていて、Backup Operators
グループには割り当てられていないユーザー権利のうち、監査管理に関係しそうなものを精査したところ、SeSecurityPrivilege
ユーザー権利(「監査とセキュリティ ログの管理」ポリシー)が見つかりました。
そこで、コピー元サーバーのBackup Operators
グループに追加したままで、「グループ ポリシーの編集」から「監査とセキュリティ ログの管理」ポリシーにも私のアカウントを追加します。オプションを/COPYALL
に戻してRobocopyを実行したところ、ついにBackup Operators
グループでもファイルの全項目をコピーすることに成功しました。
-------------------------------------------------------------------------------
ROBOCOPY :: Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------
開始: 2023年10月18日 15:34:29
コピー元 : E:\dummydata1\
コピー先 : \\XXXXXXXXXX\Robocopy-test\dummydata1\
(略)
オプション: *.* /NDL /NFL /S /E /COPYALL /PURGE /MIR /B /NP /XJ /R:0 /W:0
------------------------------------------------------------------------------
------------------------------------------------------------------------------
合計 コピー済み スキップ 不一致 失敗 Extras
ディレクトリ: 1 1 0 0 0 0
ファイル: 100 100 0 0 0 0
バイト: 100.00 m 100.00 m 0 0 0 0
時刻: 0:00:42 0:00:42 0:00:00 0:00:00
速度: 2485012 バイト/秒
速度: 142.193 MB/分
終了: 2023年10月18日 15:35:12
必要最小限のユーザー・共有権限
コピー元サーバーにAdministrators
グループの権限は必ずしも必要ないことがわかりましたが、さらに権限を絞れないものでしょうか。そこで、コピー元サーバーにおけるRobocopyを実行するアカウントの権限をもっと検証することにします。コピー元サーバーでもSeBackupPrivilege
とSeRestorePrivilege
のユーザー権利が必要なことがわかっているので、「グループ ポリシーの編集」から「ファイルとディレクトリのバックアップ」と「ファイルとディレクトリの復元」のポリシーに私のアカウントを追加して、Robocopyが実行できることを確認してみます。
-------------------------------------------------------------------------------
ROBOCOPY :: Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------
開始: 2023年10月18日 15:50:34
コピー元 : E:\dummydata1\
コピー先 : \\XXXXXXXXXX\Robocopy-test\dummydata1\
(略)
オプション: *.* /NDL /NFL /S /E /COPYALL /PURGE /MIR /B /NP /XJ /R:0 /W:0
------------------------------------------------------------------------------
------------------------------------------------------------------------------
合計 コピー済み スキップ 不一致 失敗 Extras
ディレクトリ: 1 1 0 0 0 0
ファイル: 100 100 0 0 0 0
バイト: 100.00 m 100.00 m 0 0 0 0
時刻: 0:00:41 0:00:41 0:00:00 0:00:00
速度: 2513244 バイト/秒
速度: 143.809 MB/分
終了: 2023年10月18日 15:51:17
Backup Operators
グループにRobocopyを実行するアカウントを追加しなくても、アカウントにSeBackupPrivilege
、SeRestorePrivilege
、SeSecurityPrivilege
のユーザー権利が存在すれば、バックアップモードでRobocopyを実行できることが確認できました。
おわりに
検証の結果、Robocopyのバックアップモードを利用して、Windows Serverの共有フォルダーへコピーするには、以下の権限が最小限必要なことがわかりました。
権限の種類 | 必要な権限 |
---|---|
コピー元サーバーにおける実行アカウントのユーザー権利 | SeBackupPrivilege 、SeRestorePrivilege 、SeSecurityPrivilege (監査情報がコピー対象の場合のみ) |
コピー先サーバーにおける実行アカウントのユーザー権利 | SeBackupPrivilege 、SeRestorePrivilege |
コピー先フォルダーの共有アクセス権 | フル コントロール |
Windows Serverに限らず、きめ細かい認可を制御できるシステムやサービスを運用する際は、つい必要以上に強い権限を利用しがちです。検証段階では問題ないのかもしれませんが、本来の目的に必要な最小限の権限を調査して、本番環境では最小権限の原則を適用することでセキュリティを高めていきたいものですね。