考虑一个具有用户只读权限的文件,例如......
-r--------+ admin secrets.txt
如何才能将这样的文件置于修订控制之下,以致其内容保持秘密,甚至对修订控制管理员来说也是如此?
答案1
在提交到你的 repo 之前使用 GPG 加密文件。
是的,这很麻烦(如果不先解密,您将无法进行差异/合并/等),但我想不出任何其他办法来解决这一问题。
答案2
将秘密存储在单独的文件中(不受版本控制),并使用脚本或类似 Puppet 的工具将秘密内容插入另一个文件中。
工作于另一个答案一个简单的例子是:
netjoin.sh.erb(存储在版本控制中):
#!/bin/sh
# Usage: netjoin.sh /path/to/samba/binary/net pdc-hostname
NET=$1
SERVER=$2
HOSTNAME=`facter hostname`-`facter operatingsystem`
PASSWORD=<%= scope.function_generate("/etc/puppet/auth/getpwd", "ad", "netjoin") %>
${NET} rpc user delete ${HOSTNAME}\$ -U netjoin%${PASSWORD} -S ${SERVER}
${NET} rpc join -U netjoin%${PASSWORD} -S ${SERVER}
/bin/rm -f $0
/etc/puppet/auth/getpwd(也可以存储在版本控制中):
#!/bin/bash
# /etc/puppet/auth/getpwd
if [ "$#" -ne 2 ]; then
echo "Usage: $0 <db> <user>"
exit 1
fi
if [ ! -x /usr/bin/pwgen ]; then
echo "missing pwgen!" >&2
exit 1
fi
workdir=`dirname $0`
workfile="$workdir/passwd_$1"
[ ! -r $workfile ] && exit 2
get_name="$2"
# get password from storage
pwd=`egrep "^${get_name}:" ${workfile} | cut -d: -f2-`
if [ "$pwd" = "" ]; then
# generate new password & store it
len=$((60 + $RANDOM % 9 ))
pwd=$(/usr/bin/pwgen -s $len 1)
echo "${get_name}:${pwd}" >> $workfile
fi
# echo password (without new line)
echo -n "$pwd"
/etc/puppet/auth/passwd_ad(绝对不在版本控制中):
netjoin:0Gb2iHFsnXZUnsyr0XSMxVvJVJ64zqpBzLFZXEoss5XVM9vTHWgvLHokBKclC
答案3
使用 Perforce 对版本敏感的文件进行处理时要小心 —— 由于 Perforce 不处理除可执行位之外的文件权限,这取决于您的 umask,当您将它们签入 Perforce 时,您会惊讶地发现文件权限会变得混乱:
$ p4 init
Matching server configuration from 'perforce:1666':
case-sensitive (-C0), unicode (-xi)
Server lester-dvcs-1449094406 saved.
$ date > x
$ l x
-rw-rw-r--. 1 lester lester 30 Dec 3 09:13 x
$ chmod 400 x
$ l x
-r--------. 1 lester lester 30 Dec 3 09:13 x
$ umask
002
$ p4 add x; p4 submit -d add
//stream/main/x#1 - opened for add
Submitting change 1.
Locking 1 files ...
add //stream/main/x#1
Change 1 submitted.
$ l x
-rw-rw-r--. 1 lester lester 30 Dec 3 09:13 x <-- oops!
如果有人有好的解决方法,我洗耳恭听!与此同时,我正在使用 mercurial/git 对我的秘密文件(实际上是 /etc)进行版本控制,并将 repo 推送到安全的地方 - 至少我的本地文件的权限将保持不变。