Предупреждение |
---|
Для осуществления подписи ПО установить пакеты: bsign, binutils, gzip, lzma, bzip2, gnupg:
Command |
---|
sudo apt install bsign binutils gzip lzma bzip2 gnupg |
|
Подпись пакетов в Astra Linux SE 1.6
Подписывание пакетов должно осуществляться от имени администратора через механизм sudo. Закрытый ключ для подписывания должен быть импортирован в набор его ключей командой:
Command |
---|
gpg --import secret_key.key |
Для проверки правильности импорта:
Command |
---|
gpg --list-secret-keys |
Для подписывания пакетов может быть использован сценарий.
Раскрыть |
---|
|
Блок кода |
---|
#!/bin/bash
#---------------------
key_id=""
pass_file=""
DIR_BIN=$1
DIR_SIGNED=$2
#---------------------
TMP_DIR=$DIR_SIGNED/tmp$$
if [ -z $DIR_BIN ] ; then
echo "Specify original directory as first argument."
exit 1
fi
if [ -z $DIR_SIGNED ] ; then
echo "Specify destination directory as second argument."
exit 1
fi
if [ ! -e $DIR_BIN ] ; then
echo "Original directory $DIR_BIN doesn't exist."
exit 1
fi
list_of_packages=`find $DIR_BIN -type f -name "*.deb"`
list_of_udebs=`find $DIR_BIN -type f -name "*.udeb"`
for i in $list_of_packages ; do
pack_name=`echo $i | awk '{sub(/^.+\//,"",$0) ; a=$0; print a}'`
echo "Unpacking $pack_name"
mkdir -p $TMP_DIR/{control,data}
cp $i $TMP_DIR
pushd $TMP_DIR &>/dev/null
fakeroot ar x $pack_name
SIGN_LOG=${DIR_SIGNED}/${pack_name}.log
# Definig archives type
data_arch_type=`ls data.tar* | cut -d'.' -f3`
control_arch_type=`ls control.tar* | cut -d'.' -f3`
popd &>/dev/null
# Unpack data archive
pushd $TMP_DIR/data &>/dev/null
case $data_arch_type in
gz)
fakeroot tar --same-permissions --same-owner -xzf ../data.tar.gz
;;
bz2)
fakeroot tar --same-permissions --same-owner -xjf ../data.tar.bz2
;;
lzma)
fakeroot tar --same-permissions --same-owner --lzma -xf ../data.tar.lzma
;;
xz)
fakeroot tar --same-permissions --same-owner -xJf ../data.tar.xz
;;
esac
popd &>/dev/null
# Unpack control archive
pushd $TMP_DIR/control &>/dev/null
case $control_arch_type in
gz)
fakeroot tar --same-permissions --same-owner -xzf ../control.tar.gz
;;
bz2)
fakeroot tar --same-permissions --same-owner -xjf ../control.tar.bz2
;;
lzma)
fakeroot tar --same-permissions --same-owner --lzma -xf ../control.tar.lzma
;;
xz)
fakeroot tar --same-permissions --same-owner -xJf ../control.tar.xz
;;
esac
popd &>/dev/null
# Sign files
pushd $TMP_DIR/data &> /dev/null
list=`find . -type f`
for file in $list ; do
elf=`file $file | cut -d: -f2 | awk -F' ' '{print $1}'`
if [ $elf = "ELF" ]; then
#if [ "$(file $file | grep ELF)" ];then
oldstat=`stat -c %a $file`
bsign -N -s --pgoptions="--batch --pinentry-mode=loopback --passphrase-file=$pass_file --default-key=$key_id" $file
bsign -w $file
newstat=`stat -c %a $file`
[ $newstat != $oldstat ] && echo "BSIGN_CHMOD_ERROR in $file" >> ${SIGN_LOG} 2>&1
else
echo "$file not ELF"
fi
done
popd &> /dev/null
# Counting md5sums
pushd $TMP_DIR/control &>/dev/null
if [ -e ./md5sums ] ; then
filenames=`cat md5sums | awk -F' ' '{print $2}'`
popd &>/dev/null
pushd $TMP_DIR/data &> /dev/null
for j in $filenames
do
echo `md5sum $j` >> $TMP_DIR/control/md5sums.new
done
sed -e 's/\ /\ \ /g' $TMP_DIR/control/md5sums.new > $TMP_DIR/control/md5sums.new_mod
popd &> /dev/null
mv -f $TMP_DIR/control/md5sums.new_mod $TMP_DIR/control/md5sums &> /dev/null
rm -f $TMP_DIR/control/md5sums.new &> /dev/null
fi
# Packing back in deb
pushd $TMP_DIR/data &> /dev/null
case $data_arch_type in
gz)
fakeroot tar --same-permissions --same-owner -czf ../data.tar.gz .
;;
bz2)
fakeroot tar --same-permissions --same-owner -cjf ../data.tar.bz2 .
;;
lzma)
fakeroot tar --same-permissions --same-owner --lzma -cf ../data.tar.lzma .
;;
xz)
fakeroot tar --same-permissions --same-owner -cJf ../data.tar.xz .
;;
esac
popd &> /dev/null
pushd $TMP_DIR/control &> /dev/null
case $control_arch_type in
gz)
fakeroot tar --same-permissions --same-owner -czvf ../control.tar.gz .
;;
bz2)
fakeroot tar --same-permissions --same-owner -cjvf ../control.tar.bz2 .
;;
lzma)
fakeroot tar --same-permissions --same-owner --lzma -cvf ../control.tar.lzma .
;;
xz)
fakeroot tar --same-permissions --same-owner -cJvf ../control.tar.xz .
;;
esac
popd &> /dev/null
pushd $TMP_DIR &> /dev/null
fakeroot ar rcs $TMP_DIR/$pack_name debian-binary control.tar.$control_arch_type data.tar.$data_arch_type &> /dev/null
cp ${pack_name} $DIR_SIGNED/${pack_name%.deb}_signed.deb &> /dev/null
echo "Creating $DIR_SIGNED/${pack_name%.deb}_signed.deb"
popd &> /dev/null
rm -rf $TMP_DIR &> /dev/null
done
for j in $list_of_udebs ; do
cp $j $DIR_SIGNED
done
echo "done"
exit 0 |
|
В сценарии необходимо указать
Информация |
---|
|
key_id="ID Вашего ключа" pass_file="Абсолютный путь к файлу с парольной фразой" |
Сценарий должен запускаться от имени пользователя root. В качестве первого аргумента должен быть указан полный путь до каталога, содержащего пакеты, которые необходимо подписать. В качестве второго аргумента должен быть указан каталог, в который будут помещаться подписанные пакеты.
Command |
---|
sign-deb16.sh /root/pkg /root/pkg_sign |
Информация |
---|
Если ПО было подписано ранее, ключами, сгенерированными для версий ОС 1.5 и ниже, обеспечить работу такого ПО в режиме ЗПС можно установив пакет astra-digsig-oldkeys Открытые ключи необходимо размещать в директории /etc/digsig/keys/legacy/keys/ |
Подпись пакетов в ОС 1.4 и выше
Подписывание пакетов должно осуществляться от имени администратора через механизм sudo. Закрытый ключ для подписывания должен быть импортирован в набор его ключей командой:
панель |
---|
borderColor | #c2e6ff |
---|
bgColor | #e2f3ff |
---|
|
gpg --import key_for_signing.key |
Для подписывания пакетов может быть использован сценарий. Сценарий должен запускаться от имени пользователя root. В качестве первого аргумента должен быть указан полный путь до каталога, содержащего пакеты, которые необходимо подписать. В качестве второго аргумента должен быть указан каталог, в который будут помещаться подписанные пакеты.
Раскрыть |
---|
|
Блок кода |
---|
language | bash |
---|
title | sign_deb.sh |
---|
| #!/bin/bash
key_id="00000000"
pass_file="/root/key_password.txt"
DIR_BIN=$1
DIR_SIGNED=$2
TMP_DIR=$DIR_SIGNED/tmp$$
SIGN_LOG=sign.log
if [ -z $DIR_BIN ] ; then
echo "Specify original directory as first argument."
exit 1
fi
if [ -z $DIR_SIGNED ] ; then
echo "Specify destination directory as second argument."
exit 1
fi
if [ ! -e $DIR_BIN ] ; then
echo "Original directory $DIR_BIN doesn't exist."
exit 1
fi
list_of_packages=`find $DIR_BIN -type f -name "*.deb"`
list_of_udebs=`find $DIR_BIN -type f -name "*.udeb"`
for i in $list_of_packages ; do
pack_name=`echo $i | awk '{sub(/^.+\//,"",$0) ; a=$0; print a}'`
echo "Unpacking $pack_name"
mkdir -p $TMP_DIR/{control,data}
cp $i $TMP_DIR
pushd $TMP_DIR &>/dev/null
ar x $pack_name
SIGN_LOG=${DIR_SIGNED}/${pack_name}.log
# Definig archives type
data_arch_type=`ls data.tar* | cut -d'.' -f3`
control_arch_type=`ls control.tar* | cut -d'.' -f3`
popd &>/dev/null
# Unpack data archive
pushd $TMP_DIR/data &>/dev/null
case $data_arch_type in
gz)
tar --same-permissions --same-owner -xzf ../data.tar.gz
;;
bz2)
tar --same-permissions --same-owner -xjf ../data.tar.bz2
;;
lzma)
tar --same-permissions --same-owner --lzma -xf ../data.tar.lzma
;;
xz)
tar --same-permissions --same-owner -xJf ../data.tar.xz
;;
esac
popd &>/dev/null
# Unpack control archive
pushd $TMP_DIR/control &>/dev/null
case $control_arch_type in
gz)
tar --same-permissions --same-owner -xzf ../control.tar.gz
;;
bz2)
tar --same-permissions --same-owner -xjf ../control.tar.bz2
;;
lzma)
tar --same-permissions --same-owner --lzma -xf ../control.tar.lzma
;;
xz)
tar --same-permissions --same-owner -xJf ../control.tar.xz
;;
esac
popd &>/dev/null
# Sign files
pushd $TMP_DIR/data &> /dev/null
list=`find . -type f`
for file in $list ; do
elf=`file $file | cut -d: -f2 | awk -F' ' '{print $1}'`
if [ $elf = "ELF" ]; then
#if [ "$(file $file | grep ELF)" ];then
oldstat=`stat -c %a $file`
bsign -N -s --pgoptions="--default-key=$key_id --passphrase-file=$pass_file" $file
bsign -w $file
newstat=`stat -c %a $file`
[ $newstat != $oldstat ] && echo "BSIGN_CHMOD_ERROR in $file" >> ${SIGN_LOG} 2>&1
else
echo "$file not ELF"
fi
done
popd &> /dev/null
# Counting md5sums
pushd $TMP_DIR/control &>/dev/null
if [ -e ./md5sums ] ; then
filenames=`cat md5sums | awk -F' ' '{print $2}'`
popd &>/dev/null
pushd $TMP_DIR/data &> /dev/null
for j in $filenames
do
echo `md5sum $j` >> $TMP_DIR/control/md5sums.new
done
sed -e 's/\ /\ \ /g' $TMP_DIR/control/md5sums.new > $TMP_DIR/control/md5sums.new_mod
popd &> /dev/null
mv -f $TMP_DIR/control/md5sums.new_mod $TMP_DIR/control/md5sums &> /dev/null
rm -f $TMP_DIR/control/md5sums.new &> /dev/null
fi
# Packing back in deb
pushd $TMP_DIR/data &> /dev/null
case $data_arch_type in
gz)
tar --same-permissions --same-owner -czf ../data.tar.gz .
;;
bz2)
tar --same-permissions --same-owner -cjf ../data.tar.bz2 .
;;
lzma)
tar --same-permissions --same-owner --lzma -cf ../data.tar.lzma .
;;
xz)
tar --same-permissions --same-owner -cJf ../data.tar.xz .
;;
esac
popd &> /dev/null
pushd $TMP_DIR/control &> /dev/null
case $control_arch_type in
gz)
tar --same-permissions --same-owner -czvf ../control.tar.gz .
;;
bz2)
tar --same-permissions --same-owner -cjvf ../control.tar.bz2 .
;;
lzma)
tar --same-permissions --same-owner --lzma -cvf ../control.tar.lzma .
;;
xz)
tar --same-permissions --same-owner -cJvf ../control.tar.xz .
;;
esac
popd &> /dev/null
pushd $TMP_DIR &> /dev/null
ar rcs $TMP_DIR/$pack_name debian-binary control.tar.$control_arch_type data.tar.$data_arch_type &> /dev/null
cp ${pack_name} $DIR_SIGNED/${pack_name%.deb}_signed.deb &> /dev/null
echo "Creating $DIR_SIGNED/${pack_name%.deb}_signed.deb"
popd &> /dev/null
rm -rf $TMP_DIR &> /dev/null
done
for j in $list_of_udebs ; do
cp $j $DIR_SIGNED
done
echo "Sign done" |
|
Для корректной работы сценария в строке:
панель |
---|
borderColor | #c2e6ff |
---|
bgColor | #e2f3ff |
---|
|
key_id="000000" pass_file="/root/key_password.txt" |
заменить 00000 на идентификатор ключа, с помощью которого необходимо подписать пакет, а вместо /root/key_password.txt - указать полный путь к файлу с паролем к ключу. Идентификатор ключа можно получить, используя команду:
панель |
---|
borderColor | #c2e6ff |
---|
bgColor | #e2f3ff |
---|
|
gpg --list-keys |
Скачать sign-deb_package.sh
Подписывание ПО в среде операционной системы специального назначения «Astra Linux Special Edition» версии 1.5 ключом, сгенерированным для более ранних версий
Подписывание пакетов должно осуществляться от имени администратора через механизм sudo. Закрытый ключ для подписывания должен быть импортирован в набор его ключей командой:
панель |
---|
borderColor | #c2e6ff |
---|
bgColor | #e2f3ff |
---|
|
gpg --import key_for_signing.key |
, где key_for_signing.key это название переданного Вам ключа.
Для подписывания пакетов может быть использован сценарий. Сценарий должен запускаться от имени пользователя root. В качестве первого аргумента должен быть указан полный путь до каталога, содержащего пакеты, которые необходимо подписать. В качестве второго аргумента должен быть указан каталог, в который будут помещаться подписанные пакеты.
Раскрыть |
---|
Блок кода |
---|
#!/bin/bash
key_id="00000000"
pass_file="/root/key_password.txt"
DIR_BIN=$1
DIR_SIGNED=$2
TMP_DIR=$DIR_SIGNED/tmp$$
SIGN_LOG=sign.log
if [ -z $DIR_BIN ] ; then
echo "Specify original directory as first argument."
exit 1
fi
if [ -z $DIR_SIGNED ] ; then
echo "Specify destination directory as second argument."
exit 1
fi
if [ ! -e $DIR_BIN ] ; then
echo "Original directory $DIR_BIN doesn't exist."
exit 1
fi
list_of_packages=`find $DIR_BIN -type f -name "*.deb"`
list_of_udebs=`find $DIR_BIN -type f -name "*.udeb"`
for i in $list_of_packages ; do
pack_name=`echo $i | awk '{sub(/^.+\//,"",$0) ; a=$0; print a}'`
echo "Unpacking $pack_name"
mkdir -p $TMP_DIR/{control,data}
cp $i $TMP_DIR
pushd $TMP_DIR &>/dev/null
ar x $pack_name
SIGN_LOG=${DIR_SIGNED}/${pack_name}.log
# Definig archives type
data_arch_type=`ls data.tar* | cut -d'.' -f3`
control_arch_type=`ls control.tar* | cut -d'.' -f3`
popd &>/dev/null
# Unpack data archive
pushd $TMP_DIR/data &>/dev/null
case $data_arch_type in
gz)
tar --same-permissions --same-owner -xzf ../data.tar.gz
;;
bz2)
tar --same-permissions --same-owner -xjf ../data.tar.bz2
;;
lzma)
tar --same-permissions --same-owner --lzma -xf ../data.tar.lzma
;;
xz)
tar --same-permissions --same-owner -xJf ../data.tar.xz
;;
esac
popd &>/dev/null
# Unpack control archive
pushd $TMP_DIR/control &>/dev/null
case $control_arch_type in
gz)
tar --same-permissions --same-owner -xzf ../control.tar.gz
;;
bz2)
tar --same-permissions --same-owner -xjf ../control.tar.bz2
;;
lzma)
tar --same-permissions --same-owner --lzma -xf ../control.tar.lzma
;;
xz)
tar --same-permissions --same-owner -xJf ../control.tar.xz
;;
esac
popd &>/dev/null
# Sign files
pushd $TMP_DIR/data &> /dev/null
list=`find . -type f`
for file in $list ; do
elf=`file $file | cut -d: -f2 | awk -F' ' '{print $1}'`
if [ $elf = "ELF" ]; then
#if [ "$(file $file | grep ELF)" ];then
oldstat=`stat -c %a $file`
bsign -9 -N -s --pgoptions="--default-key=$key_id --passphrase-file=$pass_file" $file
bsign -w $file
newstat=`stat -c %a $file`
[ $newstat != $oldstat ] && echo "BSIGN_CHMOD_ERROR in $file" >> ${SIGN_LOG} 2>&1
else
echo "$file not ELF"
fi
done
popd &> /dev/null
# Counting md5sums
pushd $TMP_DIR/control &>/dev/null
if [ -e ./md5sums ] ; then
filenames=`cat md5sums | awk -F' ' '{print $2}'`
popd &>/dev/null
pushd $TMP_DIR/data &> /dev/null
for j in $filenames
do
echo `md5sum $j` >> $TMP_DIR/control/md5sums.new
done
sed -e 's/\ /\ \ /g' $TMP_DIR/control/md5sums.new > $TMP_DIR/control/md5sums.new_mod
popd &> /dev/null
mv -f $TMP_DIR/control/md5sums.new_mod $TMP_DIR/control/md5sums &> /dev/null
rm -f $TMP_DIR/control/md5sums.new &> /dev/null
fi
# Packing back in deb
pushd $TMP_DIR/data &> /dev/null
case $data_arch_type in
gz)
tar --same-permissions --same-owner -czf ../data.tar.gz .
;;
bz2)
tar --same-permissions --same-owner -cjf ../data.tar.bz2 .
;;
lzma)
tar --same-permissions --same-owner --lzma -cf ../data.tar.lzma .
;;
xz)
tar --same-permissions --same-owner -cJf ../data.tar.xz .
;;
esac
popd &> /dev/null
pushd $TMP_DIR/control &> /dev/null
case $control_arch_type in
gz)
tar --same-permissions --same-owner -czvf ../control.tar.gz .
;;
bz2)
tar --same-permissions --same-owner -cjvf ../control.tar.bz2 .
;;
lzma)
tar --same-permissions --same-owner --lzma -cvf ../control.tar.lzma .
;;
xz)
tar --same-permissions --same-owner -cJvf ../control.tar.xz .
;;
esac
popd &> /dev/null
pushd $TMP_DIR &> /dev/null
ar rcs $TMP_DIR/$pack_name debian-binary control.tar.$control_arch_type data.tar.$data_arch_type &> /dev/null
cp ${pack_name} $DIR_SIGNED/${pack_name%.deb}_signed.deb &> /dev/null
echo "Creating $DIR_SIGNED/${pack_name%.deb}_signed.deb"
popd &> /dev/null
rm -rf $TMP_DIR &> /dev/null
done
for j in $list_of_udebs ; do
cp $j $DIR_SIGNED
done
echo "Sign done" |
|
Для корректной работы сценария в строке:
панель |
---|
borderColor | #c2e6ff |
---|
bgColor | #e2f3ff |
---|
|
key_id="000000" pass_file="/root/key_password.txt" |
заменить 00000 на идентификатор ключа, с помощью которого необходимо подписать пакет, а вместо /root/key_password.txt - указать полный путь к файлу с паролем к ключу. Идентификатор ключа можно получить, используя команду:
Идентификатор ключа можно получить, используя команду:
панель |
---|
borderColor | #c2e6ff |
---|
bgColor | #e2f3ff |
---|
|
gpg --list-keys |
Далее следуйте по документации
Мануалы GPG
Разбираемся в GnuPG
The internals of an OpenPGP key
Параноидальное описание параноидальной подписи