Оглавление |
---|
Информация | ||
---|---|---|
| ||
Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7), РУСБ.10015-10 |
Подписание пакетов в Astra Linux Special Edition 1.6, 8.1, x.7
Установка пакетов
Для осуществления подписания ПО необходимо установить пакеты:
- bsign;
- binutils;
- gzip;
- lzma;
- bzip2;
- gnupg.
Команда для установки пакетов:
Command |
---|
sudo apt install bsign binutils gzip lzma bzip2 gnupg |
Подготовка к подписанию пакетов
Импортировать закрытый ключ для подписания в набор ключей администратора командой:
Command sudo gpg --import secret_key.key
Проверить правильности импорта:
Command sudo gpg --list-secret-keys
Подписание пакетов
- Подписание пакетов должно осуществляться от имени администратора через механизм sudo.
- Для подписания пакетов может быть использован сценарий sign-deb.sh. Файл сценария доступен для загрузки с помощью web-браузера по ссылке sign-deb16.sh.
Для настройки сценария в сценарии необходимо указать следующие параметры:
Информация icon false key_id="<идентификатор_ключа>"
pass_file="<абсолютный_путь_к_файлу_с_паролем>"При запуске сценария:
первый аргумент указывает полный путь до каталога, содержащего пакеты, которые необходимо подписать;
второй аргумент указывает полный путь до каталогкаталога, в который будут помещены подписанные пакеты, например:
Command sudo ./sign-deb16.sh /root/pkg /root/pkg_sign
Исходный текст сценария:
Блок кода | ||||
---|---|---|---|---|
| ||||
#!/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 |
Особенности применения ПО, подписанного ключами для версий Astra Linux Special Edition 1.5 и ниже
Информация |
---|
Если ПО было подписано ранее, ключами, сгенерированными для версий Astra Linux Special Edition 1.5 и ниже, обеспечить работу такого ПО в режиме ЗПС можно установив пакет |
Подписание пакетов в Astra Linux Special Edition РУСБ.10015.01 1.4 и 1.5
Подписание пакетов должно осуществляться от имени администратора через механизм sudo. Закрытый ключ для подписания должен быть импортирован в набор ключей администратора командой:
панель | ||||
---|---|---|---|---|
| ||||
sudo gpg --import 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 -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" |
Для корректной работы сценария откорректировать строки сценария:
панель | ||||
---|---|---|---|---|
| ||||
key_id="000000" |
Заменив значение 00000 на идентификатор ключа, с помощью которого необходимо подписать пакет, а путь /root/key_password.txt на полный путь к файлу с паролем к ключу. Идентификатор ключа можно получить, используя команду:
панель | ||||
---|---|---|---|---|
| ||||
gpg --list-keys |
Скачать sign-deb_package.sh
Подписание ПО в среде операционной системы специального назначения Astra Linux Special Edition РУСБ.10015-01 1.5 ключом, сгенерированным для более ранних версий
Подписание пакетов должно осуществляться от имени администратора через механизм sudo. Закрытый ключ для подписания должен быть импортирован в набор его ключей командой:
панель | ||||
---|---|---|---|---|
| ||||
sudo 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" |
Для корректной работы сценария в строках:
панель | ||||
---|---|---|---|---|
| ||||
key_id="000000" |
заменить 00000 на идентификатор ключа, с помощью которого необходимо подписать пакет, а вместо /root/key_password.txt - указать полный путь к файлу с паролем к ключу. Идентификатор ключа можно получить, используя команду:
панель | ||||
---|---|---|---|---|
| ||||
gpg --list-keys |
Далее следуйте указаниям в документации.
Дополнительные материалы по GPG
Разбираемся в GnuPG
The internals of an OpenPGP key
Параноидальное описание параноидальной подписи