n-Archives.net

Robocopyでセキュリティ情報を正しくコピーする方法と注意点

目次

Robocopyのセキュリティ情報の扱いについて

今回、初めて、Robocopyによるセキュリティ情報のコピーについて記事にします。robocopyのセキュリティ情報の扱いについては、いろいろと動作が変わったりしてきた経緯などもあるようで、禁断の領域に踏み込む感じです。

本記事では特に、

  • セキュリティ情報コピーに関するrobocopyの現在の仕様を把握する
  • 完全な形でセキュリティ情報をコピーするにはどうすればよいか

という観点で情報を整理してみました。

網羅的にまとめようとしたところ、いろいろと少し長い記事になってしまいましたので、ちゃんとセキュリティ情報をコピーするためにはどうすればよいか、結論だけを知りたい方は、最後の結論の章をご覧ください。

 

この記事では、現在のrobocopyの仕様を調査するため、個人的にいろいろ実験した結果を整理しています。あくまでも現在のバージョンのrobocopyを使った調査に基づいて書いており、過去のバージョンや、将来のバージョンでは動作が変わっている可能性がありますので、ご注意ください。また、本記事の内容の一部は独自調査に基づき作成したもので、Microsoftの公式情報ではありませんのでご注意ください。誤りにお気づきになりましたら、ご指摘いただければ幸いです。

  • 本記事執筆時期:2020/6
  • robocopyバージョン:10.0.18362.1
  • Windowsバージョン:Windows10 1909

 

「セキュリティ情報」の対象範囲

まず、本記事で対象とする「セキュリティ情報」とは何かを明確にしておく必要があります。本記事では、ファイル・フォルダに付随する以下の3つの情報を「セキュリティ情報」と呼ぶことにします。

  • アクセス許可情報(NTFSのACL情報。この情報のみを指してセキュリティ情報と呼ぶこともある。)(S)
  • 所有者情報 (O)
  • 監査情報 (U)

既にお分かりと思いますが、/COPY:copyflags の S, O, U フラグに相当する情報です。

 

なぜこの対象範囲が重要かというと、robocopy のオプションに「セキュリティ情報」を指定した場合の動作は、指定しない場合と異なってくるためです。robocopyのデフォルトでは、/COPY:DAT となっており、セキュリティ情報(SOU) は含まれず、コピーされません。 /COPY に SOUのいずれかを含めて指定すると、セキュリティ情報がコピーされることになりますが、robocopyの動作が変わることを意識しなければなりません。

詳細に入る前に、/COPY オプションの各パラメータと、3つのセキュリティ情報についておさらいしたいと思います。

 

/COPYオプションのパラメータ

robocopyで、ファイル・フォルダのどの項目をコピーするかは /COPY:copyflags オプションで指定します。copyflags には、コピーする項目に応じて DATSOUの文字の組み合わせを指定します。それぞれ以下の通りです。

Robocopy /COPYオプションのコピー項目
copyflags 項目 説明
D データ ファイルのデータそのもの、および、代替データストリーム。
A 属性 ファイルの属性 (ReadOnly, Archive, System, Hidden など)
T タイムスタンプ ファイルのタイムスタンプ
S アクセス許可情報 (Security) NTFSのアクセス許可情報(ACL)をコピーします。コピー元コピー先ともにNTFSである必要があります。
このアクセス許可情報を指して「セキュリティ情報」と呼ぶこともある。
O 所有者情報 (Owner) NTFSの所有者情報をコピーします。コピー元コピー先ともにNTFSである必要があります。
U 監査情報 (aUdit) NTFSの監査情報をコピーします。コピー元コピー先ともにNTFSである必要があります。

robocopyのデフォルト動作では、/COPY:DAT となっており、セキュリティ情報(アクセス許可情報、所有者情報、監査情報)はコピーされません。

 

/COPY オプションについては、/SEC, /COPYALL というバリエーションもあります。まとめると以下の表のようになります。

Robocopy /COPYオプションのコピー項目
copyflags 項目 デフォルト
(オプション無し)
/COPY:
copyflags
/SEC /COPYALL
D データ
A 属性
T タイムスタンプ
S アクセス許可情報  
O 所有者情報    
U 監査情報    

△は copyflags に指定した項目が有効になります。

 

S: アクセス許可情報とは

NTFSのファイルに設定されるアクセス許可情報のことで、ファイルへのアクセス権限を示したルールのことをいいます。ファイルアイコンの右クリック→プロパティ画面→セキュリティタブ、で表示されます。また、このアクセス許可情報のことを、Access Control List(ACL)と記述している場合もあります。

また、「詳細設定」ボタンでアクセス許可情報の詳細を表示・編集できます。

 

O: 所有者情報とは

所有者情報はそのファイルを作成したユーザ、または、所有者として登録されたユーザのことで、ファイルのプロパティ画面→詳細設定→ファイルのセキュリティの詳細設定、の画面に表示されます。この画面から所有者を変更することもできます。

 

U: 監査情報とは

監査とは、システム内の様々なイベントの履歴をセキュリティログに記録することができる仕組みのことです。ファイルに対しては、どのユーザが、いつ、どのようなアクセス(読み取り、書き込みなど)をしたか、履歴を記録することができます。一つ一つのファイルごとに、どのユーザの、どのような種類のアクセスをログに記録するかを詳細にルールを記述できます。そのルールのことを監査ルールと呼びます。監査情報とは監査ルールのことを指します。

ファイルのセキュリティの詳細設定画面→監査タブ→(管理者権限の確認)→監査ルールの表示、でルールを設定、確認することができます。

 

 

セキュリティ情報をコピーするための前提条件

セキュリティ情報をrobocopyでコピーする場合、前提条件として以下の点に注意してください。

 

管理者で実行する

通常のユーザ権限のコマンドプロンプトでは、セキュリティ情報はコピーできませんので、管理者として実行してください。

管理者権限を持つユーザであったとしても、通常のコマンドプロンプトでは、セキュリティ情報のコピーを行うことができませんので、必ず、「管理者で実行する」で起動されたコマンドプロンプトから実行してください。その方法について以下の参考記事をご覧ください。

参考記事:「Windows10でコマンドプロンプトを管理者として実行する方法

 

RoboSyncをお使いの方は、RoboSync自体を「管理者で実行する」から起動してください。Windowsメニュー → RoboSyncを右クリック → その他 → 管理者として実行、で実行できます。

 

コピー元コピー先ともにNTFSであること

robocopyで扱うセキュリティ情報はNTFSで管理されるセキュリティ情報を前提としていますので、コピー元、コピー先ともにNTFSであることが前提となります。

FAT32 などのファイルシステムでは、セキュリティ情報を管理できません。NTFS以外のファイルシステムのドライブを、コピー元またはコピー先に指定している場合は、以下のようなエラーが表示され、セキュリティ情報はコピーされません。

 「注意: セキュリティがコピーされない可能性があります - コピー先で固定 ACL がサポートされていない可能性があります。」

 

セキュリティ情報コピー時の動作

それでは、セキュリティ情報を指定した場合のコピー動作について以下にまとめます。

 

通常時のrobocopyのコピー動作(おさらい)

記事「Robocopyの基本動作とコマンド解説」でも書きましたが、robocopyではコピーするファイル・フォルダの状態により以下のようなクラスに分類され、それぞれ処理が行われます。以下の表は、通常時、すなわち、セキュリティ情報がコピー項目に含まれていない場合(/COPY:DAT時)の動作になります。この動作は多くの方がすでに理解されている動きかと思います。

robocopyのクラス分類とコピー動作(通常時)
クラス クラス条件 コピー動作
コピー元 コピー先 更新時刻 サイズ 属性 デフォルト
コピー動作
関連
オプション
Lonely ある ない する /XLで除外
Tweaked ある ある 一致 一致 不一致 しない /ITで含める
Same ある ある 一致 一致 一致 しない /ISで含める
Changed ある ある 一致 不一致 する /XCで除外
Newer ある ある 元>先 *2 する /XNで除外
Older ある ある 元<先 *2 する /XOで除外
Extra ない ある - *3 /XXで除外
/PURGE, /MIR
Mismatched ある*1 ある*1

*1: コピー元がファイルでコピー先がフォルダ、またはその逆
*2: 「元>先」はコピー元ファイルの方が新しい、「元<先」はコピー先ファイルの方が新しい
*3: /PURGEまたは/MIR指定時コピー先を削除

 

セキュリティ情報指定時のrobocopyのコピー動作

一方、コピー項目にセキュリティ情報が指定された場合(/COPY に SOU いずれかが指定された場合)、上記の通常時動作では説明できない挙動が出てきます。robocopyの過去の議論、実際に動作を調べてみた結果などを総合すると、以下の通りです。 

セキュリティコピー指定時のクラス分類とコピー動作
クラス クラス条件 コピー動作
コピー元 コピー先 更新時刻 サイズ 属性 MFT
更新時刻
デフォルト
コピー動作
関連
オプション
Lonely ある ない する /XLで除外
Tweaked ある ある 一致 一致 不一致 しない /ITで含める
Same ある ある 一致 一致 一致 一致 しない /ISで含める
Modified ある ある 一致 一致 一致 不一致 しない /IMで含める *4
Changed ある ある 一致 不一致 する /XCで除外
Newer ある ある 元>先 *2 する /XNで除外
Older ある ある 元<先 *2 する /XOで除外
Extra ない ある - *3 /XXで除外
/PURGE, /MIR
Mismatched ある*1 ある*1

*1: コピー元がファイルでコピー先がフォルダ、またはその逆
*2: 「元>先」はコピー元ファイルの方が新しい、「元<先」はコピー先ファイルの方が新しい
*3: /PURGEまたは/MIR指定時コピー先を削除
*4: /COPYオプションでSOUいずれかがコピーフラグに含まれている場合、/IM が自動的に付加される。

ご覧の通り、「Modified」クラスが新たに増えています。実際には、通常時の「Same」クラスが2つに分類されたというイメージです。

Modified と Same との違いは、「MFT更新時刻」が一致しているかいないかの違いになります。「MFT更新時刻」とは、NTFSのファイルが持つタイムスタンプの1つで、ファイルのMFTエントリが更新された時刻が記録されます。通常エクスプローラなどでは表示されておらず、システム内部的に利用されているタイムスタンプといえると思います。 「MFT更新時刻」 は上記表中の「更新時刻」 とは異なり、ファイル属性やセキュリティ情報を更新した場合にも更新されます。

更新時刻とMFT更新時刻の違い
項目 説明
更新時刻 ファイルの「データ」が更新された時のタイムスタンプ
MFT更新時刻 「データ」だけでなく、ファイル名、ファイル属性、セキュリティ情報など、MFT内の何らかの項目に変更があったときに更新されるタイムスタンプ

「MFT更新時刻」 の詳細については、参考記事 「NTFSのファイルが持つ8種類のタイムスタンプとは」 をご覧ください。

 

上記踏まえ、いろいろと検討した結果、Modifiedクラスを一言でいうと、「セキュリティ情報のみが変更」されているケースを指しています。 なお、「属性とセキュリティ情報の両方が変更」されているファイルは Tweakedクラスになります。

 

もう一つ大事な点は、コピー項目にセキュリティ情報が指定された場合(/COPY に SOU いずれかが指定された場合)、自動的に /IM オプションが指定され、Modifiedクラスもコピー対象になる、という点です。

 

この仕様により、おおむね、セキュリティ情報がコピーできるようになっています。ただ、一部問題があり、次章の「ファイル属性の更新との干渉問題」を参照してください。

 

ところで、/IM オプションは、どうやら最近1~2年前に追加されたオプションの様です。このオプションの存在を知る方も少ないのではないでしょうか。

 

セキュリティ情報コピーに関するrobocopyの現仕様の問題点

 

ファイル属性の更新との干渉問題

「robocopyでセキュリティ情報を含むすべての情報をコピーするためには /COPYALL を付けておけば間違いない」、と思っている方が、かなりいらっしゃると思います。

robocopy <src> <dest> /MIR /DCOPY:DAT /COPYALL

しかし、実際にこれを定期的なミラーコピーとして使っている場合、必ずしも正しくセキュリティ情報をコピーできません。

ファイル属性とセキュリティ情報両方を更新したファイルの場合、Tweaked クラスに分類されてしまい、コピーがスキップされてしまうためです。

この問題を回避するためには、Tweakedクラスもコピー対象にするため、/IT オプションを付ける必要があります。

 

/SECFIXの問題

更新コピーにおいて、コピー元と、コピー先のセキュリティ情報を完全一致させるため、robocopyには /SECFIX というオプションが準備されています。このオプションを使うと、スキップされるファイルについても、セキュリティ情報を強制的にコピーすることができます。

/SECFIXはセキュリティ情報を完璧にコピーでき、その点では問題はないのですが、現仕様のrobocopyでは別の問題が生じています。/SECFIXは、セキュリティ情報をコピーする際、コピー先のMFT更新時刻をコピー元に合わせるのではなく、コピー実行時の時刻に更新してしまうため、スキップ対象だったファイルが、次回の更新コピーにおいて全てコピー対象となってしまうのです。

ほとんどのファイルがコピー対象になってしまい、全コピーしなおすのと変わらなくなってしまいます。

対処方法については、次章で解説します。

 

ファイル属性のトグル問題

例えば、アーカイブ属性がONとなっているあるファイルについて、アーカイブ属性を一度OFFにして、再度ONにした場合、セキュリティ情報が更新されていないにもかかわらず、次回更新コピーで、Modified クラスと判断され、コピー対象となります。

ファイル属性をトグルするというケースは多くないと思いますのでそれほど問題ではないかと思いますが、多数のファイルのアーカイブ属性を更新するような環境の場合、影響が大きいかもしれません。

 

 

セキュリティ情報を完全にコピーする方法

さて、いよいよ、セキュリティ情報を完全にコピーする方法についてご紹介したいと思います。

以下の説明では、/MIR でフォルダをコピーする例で説明をしますが、他のコピーオプションでもセキュリティ情報のコピー動作は同じです。目的に応じて他オプションに読み替えてみてください。

 

初回コピーの時

コピー先が存在せず最初にコピーを行う場合、セキュリティ情報のコピーについては、ファイルもフォルダも、指定した /COPY:copyflags オプション(SOU)通りにコピーが行われます。特に問題はありません。

 

なお、これは少々意外なのですが、フォルダについても、/COPY オプションの SOUフラグ指定に基づきセキュリティ情報のコピーが行われます。D, A, T に関しては /DCOPY の指定に基づきます。

 

更新コピーの時

問題になるのは、更新コピーの場合です。

常にコピー元、コピー先を同期し、セキュリティ情報も一致させておきたい場合、以下のようにrobocopyを実行する必要があります。

  • /COPYオプションに SOU のいずれかが含まれていること。
  • /IT を付けること。
  • 初回コピーから常に同じコマンドでrobocopyによるコピーを実行すること。

例としては、以下のようなコマンドです。

(例) robocopy <src> <dest> /MIR /DCOPY:DAT /COPYALL /IT

初回コピーから同じコマンドでコピーし続けている限り、ファイル属性やセキュリティ情報も、常にコピー先に同期されることになります。

(/COPYALL の部分は、必要に応じ、/SEC, /COPY:copyflags(SOUのいずれかが入っていることが必要)を設定してください。)

 

もし、通常とは異なる /COPY オプションで更新コピーをしてしまった場合、セキュリティ情報のコピーが漏れる可能性があります。

例えば、以下のように、通常行っているコピーコマンドとは違うコマンドで実行してしまった場合です。

(通常時) robocopy <src> <dest> /MIR /DCOPY:DAT /COPYALL /IT

(誤って実行) robocopy <src> <dest> /MIR /DCOPY:DAT /IT

これは、/COPYALL指定を忘れてコピーしてしまったケースですが、その場合、「ファイル属性とセキュリティ情報の両方が更新されていたファイル」は、ファイル属性のみコピーされ、セキュリティ情報はコピーされないにもかかわらず、MFTタイムスタンプがコピーされてしまいます。そのため、次回更新コピー時、そのファイルは同一とみなされ、セキュリティ情報がコピーされなくなってしまいます。

 

セキュリティ情報がコピー元とコピー先で不一致になってしまった時の修復方法

上記の例ように、コピー元とコピー先でセキュリティ情報が不一致になってしまった場合、コピー先を一度削除して初回コピーするのが最も簡単で確実です。

しかし、もし、大きなファイルがたくさんあって全コピーをやりなおしたくない場合、以下の手順で修復処理を行ってください。以下2つのコマンドを順に実行します。

(1)  robocopy <src> <dest> /MIR /DCOPY:DAT /COPYALL /IT /SECFIX

(2)  robocopy <src> <dest> /MIR /DCOPY:T /COPY:T /IM

まず、(1) のコマンドでは、通常のミラーコピーに加え、/SECFIXにより、スキップされたファイルについても強制的にセキュリティ情報をコピーします。これで、コピー先はコピー元と完全に同じになるのですが、唯一、コピー先のMTFタイムスタンプが /SECFIX 実施時点のタイムスタンプに更新されてしまいます。そのため、そのままだと、それらファイルは全て、次回更新コピー時に「Modified」状態と判断されてしまい、コピー対象となってしまいます。(/SECFIX がMFTタイムスタンプもコピーしてくれれば、何も問題はなかったような気がしますが、どうもそのようになっていないようです。)

そこで、(2) のコマンドで、(1)でModified状態になったファイルのMFTタイムスタンプを強制的にコピー元からコピーします。/COPY:T /DCOPY:T としており、ファイルのデータはコピーされませんので、比較的短時間で処理可能だと思います。

 

/E /PURGE ではなく /MIR を使うべき

/MIR = /E /PURGE ではないということは読んだことがあると思います。唯一の違いは、/MIRがフォルダのセキュリティ情報も更新しますが、/E /PURGEはしないという点です。

実験の結果、/E /PURGE は、初回コピー時も更新コピー時も、セキュリティ情報を正しくコピーできませんので、やはり、/E /PURGE ではなく、/MIR を使うべきだと思います。

 

おまけ:セキュリティ情報に含まれるSIDに関する一般的知識

これは、robocopy固有のトピックではないのですが、セキュリティ情報を扱う上で注意しなければならないのは、ユーザやユーザグループを識別する情報が含まれている点です。アクセス許可情報、所有者情報、監査情報、いずれも、ユーザやユーザグループを識別する情報をが含んでいます。

Windows では、ユーザやグループは、セキュリティ識別子(SID)というもので識別されており、 例えば、以下のような値です。

S-1-5-21-1415123456-241234567-3331234567-1001

これはWindowsに登録された個人ユーザのSIDの例ですが、このSIDは「ドメイン」単位で管理されているIDであり、ドメイン外の環境では、識別できないIDになることに注意してください。

 企業内環境など、Active Directory(AD) ドメインでSIDが管理されている場合は、そのドメイン内(企業内)であればどのPCでも、共通のSIDを使うことができます。そのため、robocopyで他のPCにセキュリティ情報をコピーしても問題なく認識されます。

しかし、個人環境などの場合は、ドメインはPC1台ごとの単位になるため、あるPCで使われている個人ユーザのSIDは他のPCでは同じように認識されず、セキュリティ設定も同じように認識されない可能性があります。

 

セキュリティ情報コピーの際には、SIDの扱いについて十分考慮の上、実施してください。

 

参考情報:「Security identifiers」 (Microsoft)

 

結論

robocopyで、セキュリティ情報も含めてコピーを行う場合のポイントをまとめると、以下の通りとなります。

  • セキュリティ情報をコピーするためには、管理者権限で実行すること。コピー元コピー先ともNTFSであること。
  • 初回コピーは/COPYALLを付ければセキュリティ情報を正しくコピーできる。
    robocopy <src> <dest> /MIR /DCOPY:DAT /COPYALL
  • 更新コピーでセキュリティ情報を完全にコピーするためには、/IT オプションを付ける。
    更新コピーは、常に同じコマンドで更新しないと、セキュリティ情報のコピー漏れが生じる可能性がある。
    robocopy <src> <dest> /MIR /DCOPY:DAT /COPYALL /IT
  • セキュリティ情報がコピー元とコピー先で不一致になってしまった時は、コピー先を削除し、初回コピーを行うのが確実。
    全コピーをしたくない場合は以下のコマンドを順に実行して修復する。
     robocopy <src> <dest> /MIR /DCOPY:DAT /COPYALL /IT /SECFIX
    
    robocopy <src> <dest> /MIR /DCOPY:T /COPY:T /IM
  • /E /PURGE は使わず /MIR を使うこと。
  • フォルダについても /COPY オプションの SOU指定に基づきセキュリティ情報がコピーされる。

※ /COPYALL は目的に応じて /SEC や /COPY オプションに置き換えてください。
※ /MIR は目的に応じて適切なオプションに置き換えてください。

 

編集後記

robocopyのセキュリティ情報のコピーについて、過去記事を見ていると、Modifiedクラスが導入されたのが、2012年頃になるようです。その当時からModifiedクラスに対する動作に問題があったようで、しばらく問題が解決されず、使い物になっていなかったように見えます。2019年頃に /IM オプションができて、なんとか少し使えるようになったのかな、といった現状でしょうか。

ただ、一方で、今回いろいろ調査してみた結果、Modifiedクラス、/IM オプションの仕様について、ちゃんときれいな表に整理できたこともあり、当初想像していたよりは仕様が整理されており、ある程度使える状態なのではないかと感じました。

今回の記事が、robocopyでセキュリティ情報を正しくコピーできる為の情報として、皆様の参考になればと思います。

 

参考リンク

 

 

 



【関連記事・関連コンテンツ】

 

コメントをお送りください
お名前:
コメント:
コメントの公開: