多用户容器环境下如何强制Chrome使用自定义策略与Kerberos认证?
使用基于Puppeteer和Google Chrome的定制版SignalFx Synthetics Agent,此前Kerberos认证通过以下配置正常工作:
- 安装
krb5-user和krb5-pkinit - 在
/etc/opt/chrome/policies/managed/中添加自定义策略 - 启动代理前执行
kinit
容器升级后部署拆分为两个用户账户,原账户通过sudo执行浏览器任务,此后Chrome忽略自定义策略,Kerberos认证失效。已尝试通过包装脚本重定向Chrome启动流程(执行kinit后调用原二进制),且确认Kerberos票据有效,但Chrome仍未使用票据。
1. 修复Chrome托管策略文件的权限与归属
Chrome对托管策略文件有严格的权限要求:必须由root拥有,且其他用户具备可读权限,否则会判定为不可信并忽略。执行以下命令修正:
# 确保策略目录及文件归属为root chown -R root:root /etc/opt/chrome/policies/managed/ # 设置文件权限为全局可读(仅root可修改) chmod -R 644 /etc/opt/chrome/policies/managed/*.json
2. 确保Kerberos票据在Chrome执行的用户上下文生成
由于sudo切换用户后,原账户的Kerberos票据缓存(路径为/tmp/krb5cc_<原账户UID>)无法被目标用户访问,需在目标用户上下文内重新获取票据:
- 修改包装脚本,在当前执行Chrome的用户下执行
kinit:
#!/bin/bash # 若使用keytab认证(推荐非交互式场景) kinit -kt /path/to/your.keytab your-principal@YOUR-REALM # 执行原Chrome二进制,传递所有参数 exec /opt/google/chrome/google-chrome.exe "$@"
- 确保keytab文件权限允许目标用户读取:
chown target-user:target-group /path/to/your.keytab chmod 600 /path/to/your.keytab
3. 传递Kerberos环境变量给Chrome
Chrome依赖KRB5CCNAME环境变量定位票据缓存,需确保该变量在Chrome的执行环境中存在:
- 在包装脚本中明确设置:
#!/bin/bash export KRB5CCNAME=/tmp/krb5cc_$(id -u) kinit -kt /path/to/your.keytab your-principal@YOUR-REALM exec /opt/google/chrome/google-chrome.exe "$@"
- 或使用
sudo -E参数保留原环境变量(需确保原环境变量已正确设置):
sudo -E -u target-user /opt/google/chrome/google-chrome
4. 强制Chrome启用Kerberos白名单
在Chrome启动参数中明确指定Kerberos认证的服务器白名单,避免策略未加载导致的认证失败:
修改包装脚本的执行命令,添加以下参数:
exec /opt/google/chrome/google-chrome.exe \ --auth-server-whitelist="*.your-domain.com" \ --auth-negotiate-delegate-whitelist="*.your-domain.com" \ "$@"
替换*.your-domain.com为实际需要Kerberos认证的域名。
5. 验证Chrome策略加载状态
若仍未解决,可通过Puppeteer检查Chrome是否成功加载策略:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch({ executablePath: '/opt/google/chrome/google-chrome' }); const page = await browser.newPage(); await page.goto('chrome://policy'); const policyData = await page.evaluate(() => { return Array.from(document.querySelectorAll('.policy-name')).map(el => { return { name: el.textContent, value: el.nextElementSibling.textContent }; }); }); console.log('Loaded Chrome Policies:', JSON.stringify(policyData, null, 2)); await browser.close(); })();
若输出中没有你的自定义策略,需检查策略文件的JSON格式是否正确,或目录路径是否符合Chrome要求(必须是/etc/opt/chrome/policies/managed/或/etc/chrome/policies/managed/)。
内容的提问来源于stack exchange,提问作者Psychozoic

