Содержание

Skip to end of metadata
Go to start of metadata

Для осуществления подписи ПО, на машине были установлены следующие пакеты: bsign, binutils, gzip, lzma, bzip2, gnupg.

Подпись пакетов в Astra Linux SE 1.6

Подписывание пакетов должно осуществляться от имени администратора через механизм sudo. Закрытый ключ для подписывания должен быть импортирован в набор его ключей командой:


gpg --import secret_key.key
Для проверки правильности импорта:
gpg --list-secret-keys
Для подписывания пакетов может быть использован скрипт.

 sign-deb16.sh
#!/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. В качестве первого аргумента должен быть указан полный путь до каталога, содержащего пакеты, которые необходимо подписать. В качестве второго аргумента должен быть указан каталог, в который будут помещаться подписанные пакеты.

 sign-deb16.sh /root/pkg /root/pkg_sign

Если ПО было подписано ранее, ключами, сгенерированными для версий ОС 1.5 и ниже, обеспечить работу такого ПО в режиме ЗПС можно установив пакет astra-digsig-oldkeys

Открытые ключи необходимо размещать в директории /etc/digsig/keys/legacy/keys/

Подпись пакетов в ОС 1.4 и выше

Подписывание пакетов должно осуществляться от имени администратора через механизм sudo. Закрытый ключ для подписывания должен быть импортирован в набор его ключей командой:

gpg --import key_for_signing.key

Для подписывания пакетов может быть использован скрипт. Скрипт должен запускаться от имени пользователя root. В качестве первого аргумента должен быть указан полный путь до каталога, содержащего пакеты, которые необходимо подписать. В качестве второго аргумента должен быть указан каталог, в который будут помещаться подписанные пакеты.

 Скрипт для подписи
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"


Для корректной работы скрипта в строке:

key_id="000000"

pass_file="/root/key_password.txt"

заменить 00000 на идентификатор ключа,  с помощью которого необходимо подписать пакет, а вместо /root/key_password.txt - указать полный путь к файлу с паролем к ключу. Идентификатор ключа можно получить, используя команду:

gpg --list-keys

Скачать sign-deb_package.sh

Подписывание ПО в среде операционной системы специального назначения «Astra Linux Special Edition» версии 1.5 ключом, сгенерированным для более ранних версий

Подписывание пакетов должно осуществляться от имени администратора через механизм sudo. Закрытый ключ для подписывания должен быть импортирован в набор его ключей командой:

gpg --import key_for_signing.key

, где key_for_signing.key это название переданного Вам ключа.

Для подписывания пакетов может быть использован скрипт. Скрипт должен запускаться от имени пользователя root. В качестве первого аргумента должен быть указан полный путь до каталога, содержащего пакеты, которые необходимо подписать. В качестве второго аргумента должен быть указан каталог, в который будут помещаться подписанные пакеты.

 Click here to expand...
#!/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"

pass_file="/root/key_password.txt"

заменить 00000 на идентификатор ключа,  с помощью которого необходимо подписать пакет, а вместо /root/key_password.txt - указать полный путь к файлу с паролем к ключу. Идентификатор ключа можно получить, используя команду:

Идентификатор ключа можно получить, используя команду:

gpg --list-keys

Далее следуйте по документации

Мануалы GPG

Разбираемся в GnuPG
The internals of an OpenPGP key
Параноидальное описание параноидальной подписи