Данная статья применима к:

Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7), РУСБ.10015-10
Astra Linux Special Edition РУСБ.10015-17
Astra Linux Special Edition РУСБ.10015-37 (очередное обновление 7.7)
Astra Linux Special Edition РУСБ.10015-03 (очередное обновление 7.6)
Astra Linux Special Edition РУСБ.10152-02 (очередное обновление 4.7)
Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)
Astra Linux Special Edition РУСБ.10015-16 исп. 1
Astra Linux Special Edition РУСБ.10015-16 исп. 2
Astra Linux Special Edition РУСБ.10265-01 (очередное обновление 8.1)
Astra Linux Common Edition 2.12

Подписание пакетов в Astra Linux Special Edition 1.6, 8.1, x.7

Установка пакетов

Для осуществления подписания ПО необходимо установить пакеты:

  • bsign
  • binutils
  • fakeroot
  • gzip
  • lzma
  • bzip2
  • gnupg

Команда для установки пакетов:

sudo apt install bsign binutils fakeroot gzip lzma bzip2 gnupg

Подготовка к подписанию пакетов

  1. Импортировать закрытый ключ для подписания в набор ключей администратора командой:

    sudo gpg --import secret_key.key

  2. Проверить правильности импорта:

    sudo gpg --list-secret-keys

Подписание пакетов

  1. Подписание пакетов должно осуществляться от имени администратора через механизм sudo.
  2. Для подписания пакетов может быть использован сценарий sign-deb.sh. Файл сценария доступен для загрузки с помощью web-браузера по ссылке sign-deb16.sh.
  3. Для настройки сценария в сценарии необходимо указать следующие параметры:

    key_id="<идентификатор_ключа>"
    pass_file="<абсолютный_путь_к_файлу_с_паролем>"
  4. При запуске сценария:

    1. первый аргумент указывает полный путь до каталога, содержащего пакеты, которые необходимо подписать;

    2. второй аргумент указывает полный путь до каталога, в который будут помещены подписанные пакеты, например:

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

Исходный текст сценария:

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

Особенности применения ПО, подписанного ключами  для версий Astra Linux Special Edition 1.5 и ниже

Если ПО было подписано ранее, ключами, сгенерированными для версий Astra Linux Special Edition 1.5 и ниже, обеспечить работу такого ПО в режиме ЗПС можно установив пакет astra-digsig-oldkeys. Открытые ключи необходимо размещать в каталоге /etc/digsig/keys/legacy/keys/

Подписание пакетов в Astra Linux Special Edition РУСБ.10015.01 1.4 и 1.5

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

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 РУСБ.10015-01 1.5 ключом, сгенерированным для более ранних версий

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

sudo gpg --import key_for_signing.key

где 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 -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
Параноидальное описание параноидальной подписи

1 Comment

  1. if [ -z $DIR_SIGNED ] ; then echo "Specify destination directory as second argument." exit 1_ fi
    fi нужно перенести на следующую строку