Контроль версий конфиденциальных файлов конфигурации
Рассмотрим файл с правами только для чтения, например...
-r--------+ admin secrets.txt
Как поставить такой файл под контроль версий, чтобы его содержимое оставалось секретным даже от администратора контроля версий?
3 ответа
Используйте GPG, чтобы зашифровать файл перед передачей в репозиторий.
Да, это громоздко (вы не сможете разложить / объединить / и т. Д. Без расшифровки в первую очередь), но я не могу придумать какой-либо другой способ снять шкуру с этой кошки.
Сохраните секреты в отдельном файле (не под контролем версий) и вставьте секретный контент в другой файл с помощью скрипта или инструмента, похожего на 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
Будьте осторожны, когда вы создаете файлы, чувствительные к версии, с помощью 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) и помещаю репозиторий в безопасное место - по крайней мере, разрешения моих локальных файлов останутся неизменными.