Контроль версий конфиденциальных файлов конфигурации

Рассмотрим файл с правами только для чтения, например...

-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) и помещаю репозиторий в безопасное место - по крайней мере, разрешения моих локальных файлов останутся неизменными.

Другие вопросы по тегам