Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents


Info
titleДанная статья применима к:
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7)
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.5)
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.4)


Подписывание

Подписание пакетов в 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

Подписывание

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

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

Command

sudo gpg --import secret_key.key

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

Command

sudo gpg --list-secret-keys

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

Code Block
titlesign-deb16.sh
collapsetrue
#!/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

В сценарии необходимо указать:

Info
iconfalse
key_id="<идентификатор_ключа>"
pass_file="<абсолютный_путь_к_файлу_с_паролем>"

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

Command

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


Info

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

Подписывание

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

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

Panel
borderColor#c2e6ff
bgColor#e2f3ff
sudo gpg --import key_for_signing.key

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

Code Block
languagebash
titlesign_deb.sh
collapsetrue
#!/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"

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

Panel
borderColor#c2e6ff
bgColor#e2f3ff

key_id="000000"
pass_file="/root/key_password.txt"

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

Panel
borderColor#c2e6ff
bgColor#e2f3ff
gpg --list-keys

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

Подписывание

Подписание ПО в среде операционной системы специального назначения Astra Linux Special Edition РУСБ.10015-01 1.5 ключом, сгенерированным для более ранних версий

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

Panel
borderColor#c2e6ff
bgColor#e2f3ff
sudo gpg --import key_for_signing.key

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

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

Code Block
titlesign-deb.sh
collapsetrue
#!/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"

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

Panel
borderColor#c2e6ff
bgColor#e2f3ff

key_id="000000"
pass_file="/root/key_password.txt"

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

Panel
borderColor#c2e6ff
bgColor#e2f3ff
gpg --list-keys

Далее следуйте указаниям в документации.

Дополнительные материалы по GPG

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