リモート Mac でファイルを安全に受け渡す

リモート Mac でファイルを安全に受け渡す

署名用の素材、テストデータ、または受け入れ確認前のビルド成果物をクラウド Mac に転送する際、特に起こりやすいミスは、リポジトリのルートへ直接置いてしまうことです。ファイルが配置されると、インデクサー、ビルドスクリプト、クリーンアップジョブがすぐに読み取り始める可能性があります。アーカイブにディレクトリ外を指すパス、不適切な権限、説明されていない拡張属性が含まれていれば、問題はそのままワークスペース全体へ波及します。より安全なのは、「転送」と「使用」を二つの段階に分ける方法です。

最初に受け渡しの境界を定義する

受け渡しごとに、少なくとも送信者、受信者、ファイルの用途、保存期限の四項目を明確にします。ソースコードのパッチ、テストフィクスチャ、ビルド成果物、認証情報を同じアーカイブへ混在させてはいけません。認証情報は管理された注入の仕組みで提供し、チャット履歴、ビルドログ、通常のファイルパッケージへ含めないようにします。

VMRunner の専有物理ノードでも、長期間残る Downloads を使い回さず、タスクごとに専用の一時ディレクトリを作成します。ディレクトリ名にはチケット番号や社内タスク番号を使用できますが、顧客名、メールアドレス、その他の機密情報は含めないでください。

umask 077
handoff_root="$HOME/Handoffs/task-4821"
install -d -m 700 "$handoff_root/incoming"
install -d -m 700 "$handoff_root/verified"
install -d -m 700 "$handoff_root/logs"
stat -f '%Su %Sg %Sp %N' "$handoff_root" "$handoff_root/incoming"

umask 077 を設定すると、それ以降に作成されるファイルは、デフォルトで現在のユーザーだけがアクセスできます。install -d はディレクトリの作成と権限設定を同時に行うため、作成後に権限を修正するまでの一時的な露出を防げます。

一時領域の目的はファイルを永続的に保存することではありません。プロジェクトのワークスペースへ入れる前に、検査、拒否、削除ができる緩衝領域を設けることです。

送信前に照合可能な一覧を作成する

送信側は、まずディレクトリの内容を確定してからチェックサムを生成します。ビルドジョブが成果物を書き換えている最中にハッシュを計算すると、受信側へ届く一覧が別のバージョンに対応している可能性があります。先に読み取り専用の納品ディレクトリへコピーし、ファイル数を確認してから SHA-256 一覧を生成する方法が適切です。

パッケージ作成時に不要な内容を除外する

ソースコードを受け渡す場合は、.git、ローカルキャッシュ、派生データ、環境設定ファイルを除外します。ビルド成果物を受け渡す場合は、必要な署名構造と拡張属性を維持してください。容量を小さくするためだけに、アプリケーションディレクトリを安易に再パッケージしてはいけません。

cd "$HOME/Delivery/task-4821"
find . -type f ! -name 'SHA256SUMS' -print0 \
  | sort -z \
  | xargs -0 shasum -a 256 > SHA256SUMS
shasum -a 256 SHA256SUMS

受信側は、確認済みの社内経路を通じて、SHA256SUMS 自体のチェックサムを別途取得する必要があります。一覧とファイルが同じ未検証の経路から届く場合、攻撃者は両方を同時に差し替えられます。

受信後は展開前に検証する

ファイルはリポジトリへ直接上書きせず、最初に incoming へ配置します。受信が完了したら、チェックサムを照合する前に、名前、サイズ、所有者、権限を記録します。一項目でも一致しない場合は処理を停止してください。「修正してそのまま使う」ことは避けるべきです。差異の原因として、転送の中断、送信側による再パッケージ、ファイルの差し替えが考えられるためです。

cd "$handoff_root/incoming"
shasum -a 256 -c SHA256SUMS
find . -maxdepth 2 -print0 \
  | xargs -0 stat -f '%z %Su %Sg %Sp %N' \
  > "$handoff_root/logs/received-files.txt"

先にアーカイブ内のパスを確認する

ZIP アーカイブでは、最初に unzip -l package.zip を実行します。tar アーカイブでは、先に tar -tf package.tar を実行してください。絶対パス、../ によるディレクトリ外へのパス、想定外のシンボリックリンクを含むアーカイブは拒否します。内容を確認した後は空のディレクトリにだけ展開し、ファイル一覧と権限をもう一度検査します。

macOS のファイルには拡張属性が付いている場合もあります。xattr -lr を使って取得元を示す情報やその他の属性を確認し、習慣的に再帰削除してはいけません。属性の由来が明確で、影響を理解しており、タスク上も本当に必要な場合に限り、指定したファイルの指定した属性だけを処理します。

ワークスペースへ移す際に権限を制限する

検証に合格したらファイルを verified へコピーし、その後、プロジェクト責任者がワークスペースへ移します。これにより、受信時の元データとは分離された受け入れ済みのコピーを保持できます。通常の資料は現在のユーザーだけが読み書きできるようにし、ビルドが読み取るだけの固定入力は読み取り専用にできます。

cp -R "$handoff_root/incoming/ProjectInput" \
  "$handoff_root/verified/"
chmod -R go-rwx "$handoff_root/verified"
find "$handoff_root/verified" -type f -exec chmod 600 {} +
find "$handoff_root/verified" -type d -exec chmod 700 {} +

プロジェクト全体へ無差別に再帰的な chmod を実行してはいけません。実行可能スクリプト、アプリケーションバンドル、フレームワークでは必要な権限が異なるため、すべてを 600 にすると後続処理が動作しなくなる可能性があります。権限を制限する対象は、今回の一時コピーだけです。正式に取り込む際は、リポジトリの記録やビルドルールに従って必要な権限を復元します。

複数人が同じクラウド Mac で共同作業する場合は、個別のシステムユーザーと個別のディレクトリを優先してください。一時的に全ユーザーへ読み書き権限を与える方法は便利ですが、ファイルの出所や変更の責任を追跡できなくなります。

終了時にデータが残っていないことを確認する

タスクを終了する前に、プロジェクト側が必要なファイルを取得済みであることを確認し、最終チェックサムを記録します。その後、展開したコピー、失敗した再試行のパッケージ、ログの添付ファイル、ファイルを開いたままのプロセスが残っていないか確認します。lsof +D は大規模なディレクトリでは時間がかかる場合があるため、今回の一時ディレクトリに対してのみ実行してください。

lsof +D "$handoff_root" 2>/dev/null
find "$handoff_root" -type f -maxdepth 4 -print
rm -rf "$handoff_root"
test ! -e "$handoff_root" && printf '%s\n' 'handoff removed'

一時領域を削除しても、認証情報の管理が完了したとは限りません。機密値がコマンドライン引数、Shell 履歴、ビルドログ、エラーレポートへ入った場合は、該当する記録を引き続き削除し、その認証情報をローテーションする必要があります。通常の受け渡しでは、タスク識別子、送受信時刻、一覧のチェックサム、受け入れ結果、削除結果という最小限の監査情報だけを残し、ファイル本文は保存しません。

安定したリモート共同作業の手順は、「全員が注意を忘れない」ことに依存しません。すべてのファイルが、隔離、検証、許可、回収という四つの明確な段階を必ず通るようにします。これらのコマンドをチーム用スクリプトへまとめた後も、無害なサンプルを使って、ハッシュ不一致、ディレクトリ外へのパス、不正な権限を定期的にテストしてください。正常系だけでなく、拒否する処理も確実に実行できる状態を維持することが重要です。

よくある質問

受信ファイルをプロジェクトへ直接置かない方がよいのはなぜですか?

ビルドスクリプトやインデクサーが未検証のファイルをすぐ処理する可能性があります。隔離領域ならハッシュ、権限、展開内容を先に確認できます。

SHA-256 が一致すれば送信者も信頼できますか?

できません。一致によって確認できるのはファイル内容だけです。ハッシュ値は認証済みの社内経路や確認済みのサポート依頼で別途共有します。

作業終了時には何を削除すべきですか?

受信ファイル、展開先、キャッシュ、ログ、複製と使用中のプロセスを確認します。秘密情報は別経路で注入し、露出の可能性があれば更新します。

専用物理ノード

次回のビルドを専用クラウドMacで実行

モデル、ノード、課金期間を選択できます。構成と米ドル価格は注文前にすべて表示され、利用可能状況はコンソールからリアルタイムで確認できます。

プランを選んで注文