Назад | Перейти на главную страницу

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

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

-r--------+ admin secrets.txt

Как можно поставить такой файл под контроль версий, чтобы его содержимое оставалось секретным даже от администратора контроля версий?

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