fix(chv): restore 路径补 H7 net 校验+登记,seed 暂存文件走 atomic_file
restore_vm 此前既不校验 net 冲突、也不登记 net.json: 已登记 VM 的 tap/mac/ip 会被恢复出的 VM 静默复用,且 恢复出的 VM 自身不登记、后来的 wake 也看不到它,两边 都漏判。现与 wake 同款:_validate_restore 在起 VMM 前 校验冲突(net_tap_conflict + vm_failed 审计), _restore_boot 在 restore 成功后登记 net.json,登记失败 审计 net_registry_write_failed + 拒绝恢复(P2-19 语义, stop_vm 清半恢复 VM)。 hostkeys.write_seed/_apply_seed_extras 的 meta-data、 user-data、network-config 改走 atomic_file(mkstemp 0600 → 写 → fsync → rename):user-data 含 host 私钥明文, 直接写 + 事后 chmod 会在 chmod 前以 umask 权限短暂可读; 半截文件本身到不了 ISO(唯一消费者 genisoimage 只在 write_seed 返回后跑),原子写同时堵住权限窗口与半截残留。 回归测试 6 个:restore 冲突拒起/恢复后登记/登记失败 拒起/无 net_json 不登记;seed 走原子写(0600、无 tmp 残留)/写失败不留半截文件。CHV 全套件 395 测试通过。
This commit is contained in:
1 parent
f448ecb74b
commit
06c3e172fe
5 files changed
+211
-18
No files matched your search
+15
-10
@@ -34,6 +34,8 @@ import os
|
||||
import shlex
|
||||
from collections.abc import Callable
|
||||
|
||||
from cloud.chv.atomic_file import atomic_write_text
|
||||
|
||||
# seed 投递的客内密钥环境文件路径(feat-chv-secfix,H2):
|
||||
# 只在 provisioned 模式的 seed user-data 里写出,0600 root,
|
||||
# 客内 host.py 命令执行前由远程命令 source 进环境;宿主侧
|
||||
@@ -218,9 +220,10 @@ def _apply_seed_extras(seed_dir: str, user_data: str,
|
||||
user_data += "\n"
|
||||
if network_config:
|
||||
net_path = os.path.join(seed_dir, "network-config")
|
||||
with open(net_path, "w") as fh:
|
||||
fh.write(network_config)
|
||||
os.chmod(net_path, 0o600)
|
||||
# feat-chv-cover100:走 atomic_file(与 user-data 同款
|
||||
# 理由,见 write_seed)——直接写 + 事后 chmod 会在
|
||||
# chmod 前以 umask 权限短暂可读。
|
||||
atomic_write_text(net_path, network_config)
|
||||
return user_data
|
||||
|
||||
|
||||
@@ -245,10 +248,14 @@ def write_seed(seed_dir: str, vm_name: str, private_key_text: str,
|
||||
os.makedirs(seed_dir, exist_ok=True)
|
||||
meta_path = os.path.join(seed_dir, "meta-data")
|
||||
user_path = os.path.join(seed_dir, "user-data")
|
||||
with open(meta_path, "w") as fh:
|
||||
fh.write("instance-id: %s\nlocal-hostname: %s\n"
|
||||
% (vm_name, vm_name))
|
||||
os.chmod(meta_path, 0o600)
|
||||
# feat-chv-cover100:seed 暂存文件走 atomic_file(mkstemp
|
||||
# 0600 → 写 → fsync → rename):user-data 含 host 私钥
|
||||
# 明文,直接写 + 事后 chmod 会在 chmod 前以 umask 权限
|
||||
# 短暂可读;半截文件到不了 ISO(见 H5),原子写同时堵
|
||||
# 住权限窗口与半截残留。
|
||||
atomic_write_text(
|
||||
meta_path,
|
||||
"instance-id: %s\nlocal-hostname: %s\n" % (vm_name, vm_name))
|
||||
user_data = build_seed_user_data(private_key_text, public_key_text)
|
||||
merged_env = dict(guest_env or {})
|
||||
merged_env.update(secret_env or {})
|
||||
@@ -266,9 +273,7 @@ def write_seed(seed_dir: str, vm_name: str, private_key_text: str,
|
||||
user_data = user_data + "\n".join(lines) + "\n"
|
||||
user_data = _apply_seed_extras(seed_dir, user_data,
|
||||
user_data_extra, network_config)
|
||||
with open(user_path, "w") as fh:
|
||||
fh.write(user_data)
|
||||
os.chmod(user_path, 0o600)
|
||||
atomic_write_text(user_path, user_data)
|
||||
return seed_dir
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user