среда, 31 июля 2013 г.

Вступил в действие закон о запрете интернетов в сраной рашке

     Настоящий Федеральный  закон  вступает  в  силу  с  1  августа
2013 года.

Что ж,  господа, Здравствуй жопа новый год.

С сегодняшнего дня ЭТО уже наша новая реальность. ХYёвая, доложу я вам.

Вот полюбуйтесь на лурку.

Самое уродское заключается в том, что фильмы и музыку можно легко скачивать, и срали все пираты на этот ваш закон, закон касается исключительно ИНТЕРНЕТА, т.е. Сети с центральными узлами. Запретить так Kademlia невозможно, тупо потому, что у неё НЕТ никаких центральных узлов. В отличие скажем от этого(и ЛЮБОГО другого сайта). Не трудно догадаться, против кого направлен и будет действовать этот инструмент террора.


Остались мы без интернета,
Спасибо **** за это.

Настройка SSH

Мануал для настройки SSH.

http://emulek.ignorelist.com/forum/viewtopic.php?f=42&t=10734

в бложик такое плохо лезет.

среда, 24 июля 2013 г.

виртуальная клавиатура kvkbd и логин в linux

в продолжение темы про f2fs задумал я сделать логин к нетбуку, а то там клава сломана.

В силу того, что OS Slackware Linux, то я нагуглил слакобилд. Вот он:


#!/bin/sh
#-- kvkbd for Slackware --
# Build script by Phantom X 
# Suggested usage: $ kvkbd.SlackBuild 2>&1 | tee build.log
#--
# Copyright 2008, 2009, 2010, 2011 Phantom X, Goiania, Brazil.
# Copyright 2006 Martijn Dekker, Groningen, Netherlands.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# http://www.kde-apps.org/content/show.php/Kvkbd?content=56019

PACKAGER_ID=${PACKAGER_ID:-$USER}
PACKAGER=${PACKAGER:-$USER@$HOSTNAME}

# Set YES for native build with gcc >= 4.2
SB_NATIVE=${SB_NATIVE:-NO}

# Set to YES to replicate slackbuild and patches
SB_REP=${SB_REP:-YES}

CWD=$(pwd)
TMP=${TMP:-/tmp}
if [ ! -d ${TMP} ]; then
  mkdir -p ${TMP}
fi

NAME=kvkbd
PKG=${PKG:-${TMP}/package-${NAME}}

VERSION=${VERSION:-0.6}
if [ "${SB_NATIVE}" = "YES" ] ;then
  ARCH=${ARCH:-$(uname -m)}
else
  ARCH=${ARCH:-x86_64}
fi
if [ "${ARCH}" = "x86_64" ] ;then
  SLKTARGET=${SLKTARGET:-x86_64}
else
  SLKTARGET=${SLKTARGET:-i486}
fi
SLKDTARGET=${SLKDTARGET:-slackware}
BUILD=${BUILD:-1}
NJOBS=${NJOBS:-$(( $(getconf _NPROCESSORS_ONLN) + 1 ))}
DOCDIR=${PKG}/usr/doc/${NAME}-${VERSION}
SBDIR=${PKG}/usr/src/slackbuilds/kde-apps/${NAME}
PKGDEST=${PKGDEST:-${CWD}}
PKGFORMAT=${PKGFORMAT:-tgz}
PKGNAME=${NAME}-$(echo ${VERSION} | tr - . )-${ARCH}-${BUILD}${PACKAGER_ID}

DATE=$(LC_ALL=C date +%d-%b-%Y)

SRCDIR=${NAME}-${VERSION}
SRCARCHIVE=94374-${SRCDIR}.tar.bz2

DL_PROG=${DL_PROG:-wget}
DL_TO=${DL_TO:-5}
DL_OPTS=${DL_OPTS:-"--timeout=${DL_TO}"}
DL_URL="http://www.kde-apps.org/CONTENT/content-files/${SRCARCHIVE}"

# if source is not present, download in source rootdir if possible
test -r ${CWD}/${SRCARCHIVE} || ${DL_PROG} ${DL_OPTS} ${DL_URL} || exit 1

if [ "${SB_NATIVE}" = "YES" ] ;then
  SLKCFLAGS="-O2 -march=native -mtune=native -pipe"
  [ "${SB_ECFLAGS}" ] && SLKCFLAGS="${SLKCFLAGS} ${SB_ECFLAGS}"
else
  case "${ARCH}" in
    i[3-6]86) SLKCFLAGS="-O2 -march=${ARCH} -mtune=i686"
                 ;;
    x86_64) SLKCFLAGS="-O2 -fPIC"
                 ;;
    s390|*) SLKCFLAGS="-O2"
                 ;;
  esac
fi
if [ "${ARCH}" = "x86_64" ] ;then
  LIBDIRSUFFIX="64"
  SLKCFLAGS="${SLKCFLAGS} -fPIC"
else
  LIBDIRSUFFIX=""
fi

# Set the config option variables if they are not already set:
[ -r ../KDE.options ] && source ../KDE.options
[ -r /etc/profile.d/kde4.sh ] && source /etc/profile.d/kde4.sh

_kde4_prefix=${_kde4_prefix:-/usr}
_kde4_sysconfdir=${_kde4_sysconfdir:-/etc/kde}
_kde4_libdir=${_kde4_libdir:-/usr/lib${LIBDIRSUFFIX}}
_kde4_libexecdir=${_kde4_libexecdir:-/usr/libexec/kde4}
_kde4_datadir=${_kde4_datadir:-/usr/share}
_kde4_sharedir=${_kde4_sharedir:-/usr/share}
_kde4_iconsdir=${_kde4_iconsdir:-${_kde4_sharedir}/icons}
_kde4_configdir=${_kde4_configdir:-${_kde4_sharedir}/config}
_kde4_appsdir=${_kde4_appsdir:-${_kde4_sharedir}/kde4/apps}
_kde4_docdir=${_kde4_docdir:-${_kde4_prefix}/doc}
_kde4_bindir=${_kde4_bindir=:-${_kde4_prefix}/bin}
_kde4_sbindir=${_kde4_sbindir:-${_kde4_prefix}/sbin}
_kde4_includedir=${_kde4_includedir:-${_kde4_prefix}/include/kde4}
_kde4_buildtype=${_kde4_buildtype:-release}
_kde4_macros_api=${_kde4_macros_api:-2}

if [ -d ${PKG} ]; then
  # Clean up a previous build
  rm -rf ${PKG}
fi
mkdir -p ${PKG}

unset QTDIR QTINC QTLIB
export QTDIR=$(qmake-qt4 -query QT_INSTALL_PREFIX)
PATH="$(qmake-qt4 -query QT_INSTALL_BINS):${PATH}" ; export PATH

cd ${TMP}
rm -rf ${SRCDIR}
tar -xvf ${CWD}/${SRCARCHIVE} || exit 1
cd ${SRCDIR} || exit 1

chmod -R u+w,go+r-w,a-s .

# zcat ${CWD}/${NAME}.patch.gz | patch -p0 -E --backup --verbose || exit 1

export CFLAGS="${SLKCFLAGS}"
export CXXFLAGS="${SLKCFLAGS}"
export FFLAGS="${SLKCFLAGS}"

mkdir -p build
( cd build || exit 1

  cmake .. \
    -DCMAKE_EXE_LINKER_FLAGS="$CFLAGS -lX11" \
    -DCMAKE_INSTALL_PREFIX:PATH=${_kde4_prefix} \
    -DSYSCONF_INSTALL_DIR:PATH=${_kde4_sysconfdir} \
    -DINCLUDE_INSTALL_DIR:PATH=${_kde4_includedir} \
    -DLIB_INSTALL_DIR:PATH=${_kde4_libdir} \
    -DLIB_SUFFIX=${LIBDIRSUFFIX} \
    -DLIBEXEC_INSTALL_DIR:PATH=${_kde4_libexecdir} \
    -DDATA_INSTALL_DIR:PATH=${_kde4_appsdir} \
    -DMAN_INSTALL_DIR:PATH=/usr/man \
    -DCMAKE_BUILD_TYPE=${_kde4_buildtype} \
    -DBUILD_SHARED_LIBS:BOOL=ON \
    -DCMAKE_SKIP_RPATH:BOOL=ON \
    -DCMAKE_VERBOSE_MAKEFILE=ON \
    || exit 1

  make -j${NJOBS} || make || exit 1
  make install/fast DESTDIR=${PKG} || exit 1

) || exit 1

find ${PKG} | xargs file | grep -e "executable" -e "shared object" | grep ELF \
  | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null

# Add a documentation directory:
mkdir -p ${DOCDIR}
cp -a \
  AUTHORS COPYING ChangeLog README TODO ${CWD}/ChangeLog.SB \
  ${DOCDIR}/
find ${DOCDIR}/ -type d -print0 | xargs -0 chmod 0755
find ${DOCDIR}/ -type f -print0 | xargs -0 chmod 0644

# Compress and link manpages, if any:
if [ -d ${PKG}/usr/share/man ]; then
  mv ${PKG}/usr/share/man ${PKG}/usr/man
  rmdir ${PKG}/usr/share
fi
if [ -d ${PKG}/usr/man ]; then
  ( cd ${PKG}/usr/man
    for manpagedir in $(find . -type d -name "man*") ; do
      ( cd ${manpagedir}
        for eachpage in $( find . -type l -maxdepth 1) ; do
          ln -s $( readlink ${eachpage} ).gz ${eachpage}.gz
          rm -f ${eachpage}
        done
        gzip -9 *.?
        # Prevent errors
        rm -f *.gz.gz
      )
    done
  )
fi

mkdir -p ${PKG}/install
cat ${CWD}/slack-desc > ${PKG}/install/slack-desc
cat ${CWD}/slack-required > ${PKG}/install/slack-required

sed -i "s|_PACKAGER|${PACKAGER}|g; s|_BUILD_DATE|${DATE}|g" \
       ${PKG}/install/slack-desc

if [ "${SB_REP}" = "YES" ] ;then
  # Replicate slackbuild and patches
  mkdir -p ${SBDIR}
  install -m0644 ${CWD}/slack-desc ${CWD}/slack-required ${CWD}/ChangeLog.SB \
                 ${SBDIR}/
  install -m0755 ${CWD}/${NAME}.SlackBuild \
                 ${SBDIR}/${NAME}.SlackBuild
fi

# Build package:
set +o xtrace # no longer print commands upon execution

ROOTCOMMANDS="set -o errexit -o xtrace ; cd ${PKG} ;
  /bin/chown --recursive root:root . ;"

ROOTCOMMANDS="${ROOTCOMMANDS}
  /sbin/makepkg --linkadd y --chown n ${PKGDEST}/${PKGNAME}.${PKGFORMAT} "

if test ${UID} = 0; then
  eval ${ROOTCOMMANDS}
  set +o xtrace
elif test "$(type -t fakeroot)" = 'file'; then
  echo -e "\e[1mEntering fakeroot environment.\e[0m"
  echo ${ROOTCOMMANDS} | fakeroot
else
  echo -e "\e[1mPlease enter your root password.\e[0m (Consider installing fakeroot.)"
  /bin/su -c "${ROOTCOMMANDS}"
fi

# Clean up the extra stuff:
if [ "$1" = "--cleanup" ]; then
  echo "Cleaning..."
  if [ -d ${TMP}/${SRCDIR} ]; then
    rm -rf ${TMP}/${SRCDIR} && echo "${TMP}/${SRCDIR} cleanup completed"
  fi
  if [ -d ${PKG} ]; then
    rm -rf ${PKG} && echo "${PKG} cleanup completed"
  fi
  rmdir ${TMP} && echo "${TMP} cleanup completed"
fi
exit 0
скрипт несколько исправлен:

1. ставится kvkbd (слакобилд можно нагуглить, но он сейчас сломан. Что-бы его починить, надо в опции cmake добавить -DCMAKE_EXE_LINKER_FLAGS="$CFLAGS -lX11", тогда собирается и работает, исправленный скрипт выше)

2. в /etc/kde/kdm/kdmrc меняется
-UseTheme=true
+UseTheme=false

3. в /etc/kde/kdm/Xsetup +/usr/bin/kvkbd --loginhelper &
тогда при логине и при перелогине включается клава, и даже набирается. Но вот если усыпить девайс, то хрен там :-( Срабатывает блокировка. Хоть свою пиши на zenity :-( (но там нужно кучу костылей, что-бы её невозможно было-бы вырубить без пароля).
Пока пришлось сделать беспарольный вход, но это меня расстраивает.

Связанная тема на ЛОРе http://www.linux.org.ru/forum/desktop/9379797


пятница, 19 июля 2013 г.

HOWTO: использование ЭЦП и шифрования на практике

Часть первая

Часть вторая

Использование ключей для шифрования и для подписи.

Напомню краткое содержание первой части: там мы разобрали вопрос полезности ключей, а также их генерации. ИМХО полезно составить небольшую шпаргалку:


# создание нового ключа
gpg --gen-key 
# создаёт новые ключ. Ещё раз напомню, что СЕКРЕТНЫЙ КЛЮЧ ДОЛЖЕН БЫТЬ СВОЙ У КАЖДОЙ СИСТЕМЫ.

# список ключей
gpg --list-keys
gpg --list-keys KID
# список ключей и их субключей. 
# NOTE: можно добавить параметр KID -- уникальный кусок чего-то от какого-нить ключа.
# К примеру, если у меня только одни ключ содержит XYZ в имени или в описании или в почтовом адресе,
# я могу добавить только XYZ, и gpg выведет только этот ключ. Это верно и для многих других команд.
# также можно использовать ID ключа -- уникальное шестнадцатеричное восьмизначное число,
# которое выводится в списке ключей и в других случаях (это последние цифры отпечатка ключа, см. ниже)

# редактирование ключа
gpg --edit-key KID
# (см. выше NOTE, верно и для KID)
# подробности ниже

# экспорт ключа
gpg --export KID
gpg --armor --export KID
# выводит ключ на стандартный вывод
# --armor нужен для вывода в текстовом виде(такое можно смело вставлять в любой текст)

# импорт
gpg --import
# добавление ключа(ключей) из стандартного ввода в в ваше кольцо (keyring).

# шифрование
gpg --encrypt --recipient KID FILENAME
# данная команда шифрует файл FILENAME для KID.
# создаётся новый файл с именем FILENAME.gpg
# который может прочитать только KID
# можно задать несколько реципиентов, в т.ч. и себя, если это например бекап
# допустимо использовать ключ --armor, тогда имя файла будет FILENAME.asc
# и файл будет годен для вставки в любой текст

# дешифровка
gpg --decrypt FILENAME.{asc,gpg}
# расшифровывает файл и отправляет его в ст. вывод(допустимо и в файл с --output)
# для расшифровки нужен секретный ключ одного из реципиентов.

# проверка подписи
gpg --verify FILENAME.{asc,gpg,sig}
# проверяет ЭЦП FILENAME
# подпись может содержаться в самом FILENAME.gpg или лежать отдельно в файле FILENAME.sig или в FILENAME.asc

# подпись файла
gpg --sign FILENAME
gpg --sign --detach-sign FILENAME
# подписывает файл FILENAME
# если использовать --detach-sign, то подпись будет в виде отдельного файла FILENAME.sig
# вместе с --detach-sign можно использовать --armor
# для подписания требуется Ваш секретный ключ

# комбинация шифрования и подписи
gpg --sign --encrypt --recipient KID FILENAME
# шифрование и подпись можно и нужно комбинировать.
# тогда ваш реципиент будет уверен в том, что файл не подделка
# проблема в том, что публичный ключ реципиента известен всем
# в т.ч. и злоумышленнику
# а значит он может просто подменить наше сообщение
 
 
К примеру, Алиса желает отправить сообщение Бобу. У них имеется незащищённое хранилище insecure_storage, пусть это будет обычный каталог, к которому смонтированно облако яндекс-диска. Т.о. если Алиса просто отправит туда message, то злоумышленник может его не только прочитать, но и изменить. На компьютере Алисы
cp message insecure_storage/
На компьютере Боба
cp insecure_storage/message .
Тем временем на компьютере КровавойГБни
cp insecure_storage/message .
vim message
# Вау!
cp message insecure_storage/message
т.о. в иттоге Боб получит перлюстрированное и исправленное message. ИЧСХ, даже об этом не узнает, а будет уверен, что это личное дело между ним и Алисой.  

Как избежать такой атаки?

Шаг №1: Алиса и Боб создают свои ключи, и отправляют их в insecure_storage. Создание ключей уже обсуждалось. Экспорт осуществляется ключом ---export, например на компьютере Алисы

Сначала экспортируем свой ключ
gpg --export Alice >insecure_storage/alice.key
Теперь забираем ключ Боба
gpg --import insecure_storage/bob.key

(очевидно, Боб должен сделать тоже самое)

Шаг №2
В принципе, теперь Алиса может смело шифровать своё message

gpg --sign --encrypt --recipient Bob message
cp message.gpg insecure_storage/
Но не всё так просто...

Кровавая ГБня может с лёгкостью подменить insecure_storage/alice.key на свой. В дальнейшем она может непрерывно отслеживать insecure_storage, и постоянно подменять там message от Алисы на  свои, подписанные фейковым ключом. Боб этого не заметит. Также Кровавая ГБня может подменить insecure_storage/bob.key, и потому Алиса будет шифровать не для Боба, а для Кровавой ГБни. Ей(ГБне) останется только вовремя удалить insecure_storage/message от Алисы, прочитать фейковым ключом якобы Боба, а потом подписать фейковым ключём якобы Алисы и зашифровать настоящим ключом Боба. При этом Боб никак НЕ узнает, что message прочитано, и при необходимости изменено.

Данная ситуация НЕ решается в данных условиях. Имея только insecure_storage наладить связь невозможно. К счастью, не всё так трагично. В нашем сегодняшнем мире циркулируют тысячи гигабайт мусора во всех направлениях, и отследить их все в принципе невозможно.

Единственное, что нужно Алисе -- доказать Бобу, что она, это ОНА, а вовсе не Кровавая ГБня. В качестве доказательства можно использовать третью сторону, но это не слишком безопасно и надёжно (Кровавая ГБня может отслеживать третью сторону, и с помощью ректального криптоанализа _может_ заставить её делать то, что велит Политика Партии).

В качестве пруфа(доказательства), Алиса может воспользоваться своим отпечатком ключа(fingerprint). Вот к примеру отпечаток ключа моего нетбука

$ gpg --fingerprint amilo
pub   2048R/6D300475 2013-07-18
Отпечаток ключа = E3A9 7C06 C734 B779 92D3  69B5 3494 1316 6D30 0475
uid                  drBatty (amilo key) 
sub   2048R/FFE32EF7 2013-07-18
(Отпечаток выделен)
Этот отпечаток НЕ является секретным. Передать его можно вместе с _любым_ мусором, к пример прицепив его к любой фотке, что-бы его было не так заметно, его можно преобразовать, к примеру посчитать его md5. Тут даже не нужна возможность обращения Бобом этой md5, ведь получив alice.key Боб тоже узнает отпечаток, и может самостоятельно вычислить его md5. Алисе нужно лишь отправить по какому-то другому каналу Бобу этот отпечаток в любом виде. А вот задача Кровавой ГБни существенно осложняется: ей придётся закопаться во ВЕСЬ мусор, который _может_ генерировать Алиса. И в онлайне, и даже IRL(Алиса _может_ написать fingerprint на использованной прокладке, и её выкинуть на какой-то помойке. Расковыряв прокладку Боб узнает отпечаток. Т.о. Кровавой ГБне придётся даже все алисины прокладки распотрошить)

Зная отпечаток ключа, Боб может подписать alice.key своей ЭЦП, дабы в будущем не мучаться, сверяя этот отпечаток. Вот пример подписывания ключа моего нетбука. Сейчас я нахожусь дома, за десктопом ksu, GPG ID: 3B210778. При этом ключ нетбука amilo, GPG ID: 6D300475.

$ gpg --edit-key amilo
gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


pub  2048R/6D300475  создан: 2013-07-18  годен до: неогранич   применяемость: SC  
                     доверие: полное  достоверность: полное
sub  2048R/FFE32EF7  создан: 2013-07-18  годен до: неогранич   применяемость: E   
[ полное ] (1). drBatty (amilo key) 

gpg> sign

pub  2048R/6D300475  создан: 2013-07-18  годен до: неогранич   применяемость: SC  
                     доверие: полное  достоверность: полное
 Отпечаток главного ключа: E3A9 7C06 C734 B779 92D3  69B5 3494 1316 6D30 0475

     drBatty (amilo key) 

Вы уверены, что хотите подписать этот ключ
своим ключом: "drBatty (ksu) " (3B210778)

Действительно подписать? (y/N)y

Необходим пароль для доступа к секретному ключу пользователя: "drBatty (ksu) "
2048-бит RSA ключ, ID 3B210778, создан 2011-04-02
здесь был пароль к ключу ksu
                             
gpg> quit
Сохранить изменения? (y/N)y
(выделено то, что я вбивал)

Note: здесь используются два ключа: один подписывается, а ВТОРЫМ подписывают. Второй ключ получается автоматически, это первый ключ в кольце, который имеет секретную часть. Если вам нужен другой ключ, то перед командой --sign нужно указать --default-key KID, указывающий на нужный секретный ключ.

Вот теперь проверять Боб может не только просто так. Если подпись Алисы не подписана Бобом(в смысле, публичный ключ Алисы, который есть у Боба, не подписан ключом Боба), он увидит предупреждение:


gpg: ВНИМАНИЕ: Данный ключ не заверен доверенной подписью!
gpg:          Нет указаний на то, что подпись принадлежит владельцу.
 Отпечаток главного ключа: ...

Если предупреждения не было, Боб может быть уверен, что сообщение действительно от Алисы.

 Даже если мы работаем с двумя компьютерами, всё равно в ключах просто запутаться. Нужно поставить степень доверия ключу командой trust (она вводится тоже после gpg --edit-key KID).

Укажите насколько Вы доверяете данному пользователю в
вопросах проверки достоверности ключей других пользователей.
Проверяет паспорт, сверяет отпечатки ключей и т.п.?


 1 = Не знаю или не буду отвечать
 2 = Не доверяю
 3 = Доверяю ограниченно
 4 = Полностью доверяю
 5 = Абсолютно доверяю
 m = вернуться в главное меню


 Я использую абсолютную(5) степень доверия для локальных ключей, полную(4) для своих, и ограниченную(3) для чужих ключей.

Note: степень доверия локальна. Владелец этого ключа никогда не узнает, насколько вы ему доверяете. Данная опция не имеет никакого отношения к сети сертификатов.


Редактирование и удаление ключей

У каждого ключа есть свой uid(User ID), он создаётся автоматически. Но этих uid'ов может быть и более одного. Именно на uid, а вовсе не на сам ключ, и устанавливается подпись. Можно добавлять/удалять uid командами adduid/deluid, что-бы удалить uid надо его для начала выбрать, просто набрав его номер. А затем можно удалять командой deluid.

gpg> list

pub  2048R/BEC9B8A8  создан: 2013-07-19  годен до: 2014-07-19  применяемость: SC  
                     доверие: полное  достоверность: полное
sub  2048R/EFF1C7DB  создан: 2013-07-19  годен до: 2014-07-19  применяемость: E   
[ полное ] (1). emulek2 (test) 
[ полное ] (2)  emulek (autosign) 

gpg> 1

pub  2048R/BEC9B8A8  создан: 2013-07-19  годен до: 2014-07-19  применяемость: SC  
                     доверие: полное  достоверность: полное
sub  2048R/EFF1C7DB  создан: 2013-07-19  годен до: 2014-07-19  применяемость: E   
[ полное ] (1)* emulek2 (test) 
[ полное ] (2)  emulek (autosign) 

gpg> deluid
Вы действительно хотите удалить данный User ID? (y/N)y

pub  2048R/BEC9B8A8  создан: 2013-07-19  годен до: 2014-07-19  применяемость: SC  
                     доверие: полное  достоверность: полное
sub  2048R/EFF1C7DB  создан: 2013-07-19  годен до: 2014-07-19  применяемость: E   
[ полное ] (1)  emulek (autosign) 

Как видите, выбранный uid выделяется звёздочкой (*). Именно таким образом и "редактируется" ключ, если в желаете например сменить своё имя, или почтовый адрес.

Точкой "." обозначается последний добавленный uid, используемый по умолчанию.

вторник, 16 июля 2013 г.

Установка Slackware на флешку в f2fs

Тут у нас появилась неплохая новая ФС, которая f2fs, эта фс разработана специально для флешек. Кроме того, я тут нашёл старый нетбук типа amilo mini ui 3520


В этом чуде китайской инженерной мысли установлен HDD формфактора  1.8, который по слухам стучит с момента покупки. Ну факт в том, что оно у меня отстучало. Вместе с тормозной вендой, что там была в комплекте.

Ну по такому поводу я и задумал туда поставить слаку на флешке, благо текущая версия слаки содержит ядро 3.9.9-smp, которое без бубнов умеет f2fs.

Я хотел конечно отформатировать флешку целиком, но к сожалению у меня это не получилось, потому пришлось сделать два раздела:
  1. /dev/sda1 /boot/ 118M /ext2/
  2. /dev/sda2 / (rootfs) 7.2GB
(флешка объёмом 8Гб).

Хоть ядро и поддерживает f2fs, но вот к сожалению отформатировать-то и нечем. Я взял авторскую f2fs-tools (это ссылка на git репозиторий). Кроме того, я нагуглил и слакобилд. Собрав mkfs.f2fs, я уже смог отформатировать флешку в этой новой ФС.

Однако, ставил я слаку на другую флешку, отформатированную в ext4. Смонтировать просто так не получается, необходимо обязательно указывать тип ФС

mount -t f2fs /dev/sdb2 /mnt/x

Вот примерно так.

initrd

Естественно, у меня ничего не взлетело(кто-бы сомневался!), опыта в этой области у мну явно недостаточно. Впрочем, я разобрался: для загрузки ОС нужно несколько модулей, которые можно в принципе вкомпиллить в ядро. Но это не наш путь. Куда как разумнее создать маленький ramdisk прямо в памяти, откуда их и подключить. Связано это даже не с кривой ФС, а с тем, что флешки это вообще говоря совсем не простой HDD/SSD, хотя с виду и не отличимы (глядя изнутри компа).

Что-бы выяснить, какие нужны модули, я загрузился с флешки, любезно приготовленной Патрегом. В моём случае понадобилось
  1. ehci_hcd, ehci_pci -- USB2.0
  2. hid, hid_generic, hidusb -- поддержка клавиатуры USB. У меня ещё и родная клава сломалась. Впрочем, если есть ГАРАНТИЯ, что всё будет хорошо, то эти модули мне не нужны. Однако, если всё будет плохо, я могу исправить, пользуясь внешней клавой.
  3. loop тащем-то не нужен, но полезен при аварии -- монтировать разные образы.
  4. usb_storage, usb_realtek -- это как раз та самая прокладка, которое делает из USB некое подобие HDD(точнее скази).
Собственно говоря, initrd представляет собой вполне готовый и годный Linux, можно уже пользоваться. Вот только девайсы никакие не подключены, даже носители. Если что-то пойдёт не так(а у меня таки так и вышло), мы вывалимся в консоль busybox, которая представляет собой кастрированный bash.

Но для начала нужно собрать этот initrd. Собирается он специальным скриптом mkinitrd. В принципе, нам нужно только знать, где у нас будет корневая система, когда мы будем в initrd. Ну и модули конечно(см. выше). Собирается initrd в chroot'е, т.е. в такой встроенной виртуальной машине. Вот как-то так:

# сначала монтируем будущий корень
mount -t f2fs /dev/sda2 /mnt/floppy

# теперь монтируем туда спец. систему proc из хозяйской машины
mount -t proc /proc /mnt/floppy/proc

# теперь монтируем загрузочный каталог
mount /dev/sda1 /mnt/floppy/boot

# переходим в новый корень
chroot /mnt/floppy

# и отсюда идём в загрузочный каталог
cd /boot

# теперь можно создавать промежуточную корневую систему initrd
mkinitrd -c -k 3.9.9-smp -m ehci_pci:ums_realtek:hid_generic:usbhid:loop:f2fs -f f2fs -r /dev/sda2 -w 5
Описание ключей:
  • -c очистка прежнего корневого  дерева /boot/initrd-tree/
  • -k 3.9.9-smp Задаёт версию ядра. Нужен для поиска в /lib/modules, именно оттуда будут браться модули в initrd. У меня атом вместо процессора, но за то там HT. Потому я беру вариант smp (естественно ядро должно соответствовать)
  • -m Список модулей через двоеточие (см. выше)
  • -f f2fs Тип ФС
  • -r /dev/sda2 расположение корневой системы
  • -w 5 Задержка перед монтированием. Флешки определяются не мгновенно(задержка в секундах, и у меня слишком много. Можно уменьшить в моём случае)
После успешного завершения mkinitrd необходимо исправить загрузчик

lilo

Загрузчик состоит из двух частей, первая часть древняя, и занимает всего один сектор в 512 байт. Вторая часть это то, что не влезло в первую. Я использую самый простой загрузчик lilo. Он настолько прост, что не понимает ни одной ФС. Фактически, он просто загружает заданные сектора носителя, и передаёт им управление.

Для настройки загрузчика используется файл /etc/lilo.conf, вот он, с вырезанными коменнтами
boot = /dev/sdb
compact        # faster, but won't work on all systems.

  bitmap = /boot/slack.bmp
  bmp-colors = 255,0,255,0,255,0
  bmp-table = 60,6,1,16
  bmp-timer = 65,27,0,255

append=" vt.default_utf8=1"

prompt
timeout = 50

vga = normal

image = /boot/vmlinuz
  initrd = /boot/initrd.gz
  root = /dev/sda2
  label = Linux
  read-only  # Partitions should be mounted read-only for checking
Конфиг самый простой:
  • boot = /dev/sdb -- Место, куда ставится загрузчик. В момент настройки, а не работы. В данном случае ставится в MBR.
  • compact объединяет запросы к носителю вместе. ОЧЕНЬ сильно экономит время загрузки, и в особенности на флешках(очевидно потому, что на флешках страницы большие)
  • image = /boot/vmlinuz имя симлинка, указывающего на образ ядра
  • initrd = /boot/initrd.gz имя образа initrd
  • label = Linux стандартное имя опции выбора в приглашении загрузчика
  • read-only стандартная опция загрузки корневой системы
Остальные параметры обычные.

fstab

К сожалению, Kim Jaegeuk на сегодня ещё не доделал fsck, потому обходимся без проверки корневой системы. Как он доделает, будем проверять(а работы ведутся полным ходом прямо сейчас) Посему пока вот такой fstab

# монтируем корень без проверки
/dev/sda2        /                f2fs        defaults         1   0

# монтируем /boot/
/dev/sda1        /boot            ext2        defaults         1   2

#/dev/cdrom      /mnt/cdrom       auto        noauto,owner,ro,comment=x-gvfs-show 0   0
/dev/fd0         /mnt/floppy      auto        noauto,owner     0   0

devpts           /dev/pts         devpts      gid=5,mode=620   0   0
proc             /proc            proc        defaults         0   0
tmpfs            /dev/shm         tmpfs       defaults         0   0

# у меня всего 1015Мб памяти, потому для /tmp выделена половина(макс)
tmpfs            /tmp             tmpfs       nodev,nosuid,size=500M 0 0 
Необходимость выделить отдельный /boot/ тоже является временной. Проблема в том, что инсталлятор загрузчика /sbin/lilo на сегодня не понимает f2fs. Работы в этом направлении тоже ведутся, т.ч. в скором времени нам отдельный раздел /boot/ будет не нужен(на самом деле он и сейчас не нужен, если ручками сформировать карту. Но, т.к. я ленивый, то я просто использовал пока ext2. Это не на что не влияет, кроме разве что занятого места)

Удачи!

UPD: сижу вот тут с этим нетбуком. УМВР. Не тормозит как slax, это не live, нормальная годная система. Конечно пруфпик надо приложить:


вот, это я на лоре с гентушниками срусь. Ну гентушники они в своём репертуаре  -- вроде всё есть, да нихрена не работает :)

UPD2: немного запоздало ПОЗДРАВЛЯЮ ВСЕХ с двадцатилетним юбилеем Slackware Linux. Если-бы не она, так бы и компилял ядро всю жизнь. И не было-бы у меня ни детей, ни жены ;)

К счастью, есть OS которая ПРОСТО РАБОТАЕТ. Это главное.

вторник, 9 июля 2013 г.

HOWTO: использование ЭЦП и шифрования на практике

Ну такой небольшой HOWTO, по использованию электронной подписи и шифрования.

Часть первая.

Введение

Подпись применяется повсеместно, но её применение строгим образом лимитировано государством. Она называется в оффлайне "печатью", и ставится разными юр. лицами для того, что-бы было понятно, какое лицо создало данный документ. Для физ. лиц используется обычная подпись.

Для электронных документов не используется НИЧЕГО. Таким образом, получая документ, мы даже не знаем, кто его нам прислал. Для быдла это очевидно не нужно. Шибко грамотные используют обратный адрес(IP, доменное имя сайта) для установления отправителя, но никто не задумывается о том, что подделать его не просто, а очень просто. Часто используется SSL/TLS, хотя всем широко известно, что подделка этого протокола тоже возможна (ага, центр сертификации может быть скомпрометирован). Получается, что надеяться можно исключительно на себя.

Про шифрование вообще никому похоже в Этой Стране неизвестно. Его кагбэ и нет.  Ибо «честному человеку скрывать нечего». Это ложь.

Проблема в том, что честному человеку есть что скрывать, и эта информация постоянно собирается, продаётся и покупается. Личные данные нужны в основном для таргетинговой(целенаправленной) рекламы, рассылки спама, и прочей «полезной» деятельности. Естественно, иные криминальные и полукриминальные структуры также активно пользуются собранной информацией.

Для защиты информации очевидно необходимо защитится от угроз двух типов: атака подменой заключается в том, что враг подсовывает вам информацию от имени того, кому вы доверяете, а атака чтением заключается в том, что злоумышленник читает вашу информацию в тайне от вас. Если в оффлайне сделать это сложно, то в интернетах это реализуется тривиально.

Принципы и проблемы

Достаточно просто зашифровать любой файл просто сложив его обратимым(это важно!) способом с любой известной случайной(т.е. непредсказуемой, и это тоже важно!) информацией. Доказано, что если дополнительная информация действительно непредсказуемая, то не зная её невозможно расшифровать файл. Эта дополнительная информация является ключом . Размер такого ключа должен быть равен размеру файла. Но к счастью, математики сумели придумать способ разворачивания небольшого пароля в ключ нужной длинны.

Ну следуя традиции, мы будем рассматривать передачу разведчицы Алисы резиденту Бобу. Перед передачей Алиса и Боб УЖЕ должны  знать пароль. Если его никто другой не знает, то никто не сможет прочитать переданный файл кроме Боба(Алиса тут тоже может, но это не обязательно, её же файл). Из-за того, что пароль короткий, злоумышленник может его подобрать с помощью грубой силы, используя тот факт, что о статистических данных сообщения можно заранее догадаться. Для предотвращения данной атаки, Алисе нужно рандомизировать своё сообщение так, что-бы оно было неотличимо от случайного мусора. К счастью, данная задача решена, с помощью известных всем программ сжатия -- они выкидывают лишнюю информации, оставляя только необходимую. При этом, каждый бит файла увеличивает свой "вес"(энтропию) до своего максимального значения равного ½ (как монетка, про которую мы ничего не знаем). Сообщение становится максимально непредсказуемым, что существенно затрудняет подбор.

Что-бы решить задачу аутентификации(что-бы Боб был уверен, что сообщение именно от Алисы), Алиса может отправить Бобу зашифрованную известную Бобу информацию. Этим она докажет то, что она это она.

Остаётся проблема передачи самого пароля. Данную задачу решает асимметричное шифрование. Имеются математические функции, которые можно легко(сравнительно) вычислить в прямом направлении, и намного сложнее в обратном. К примеру попробуйте разложить на простые множители 539369709830409850025883673. Мой компьютер с этим справился более чем в 400 раз дольше, чем перемножал. Числа нужно взять НАМНОГО больше, дабы разложение заняло-бы заведомо нереальное время. Такое произведение можно(и нужно) публично выкладывать где угодно, а вот сами множители нужно тщательно скрывать. Множители называются секретной частью, а произведение -- публичной(или секретным и открытым ключом соответственно).

Имея публичный ключ Боба, Алиса может зашифровать файл так, что никто кроме Боба его не прочитает (включая и саму Алису). А вот своим секретным ключом, Алиса может подписать файл так, что любой может проверить подлинность файла, и для проверки ему ничего не понадобится, кроме публичного ключа Алисы.

Технически, асимметричное шифрование длинных файлов очень долгое, потому их шифруют неким одноразовым случайным паролем, а вот этот пароль шифруют асимметрично. Также и с подписью -- используется односторонняя функция от сообщения, называемая "хеш". Зная сообщения можно просто и быстро получить его хеш, но обратное преобразование невозможно. Также и коллизии(совпадения) хешей хоть и возможны теоретически, но вероятность их равна нулю (с практической т.з.) Алиса расшифровывает хеш своим секретным ключом, и то, что получилось, использует как ЭЦП. Любой может это число зашифровать публичным ключом Алисы, и получить хеш. Совпадение хешей гарантирует авторство Алисы. (подробнее, и не настолько упрощённо, см. в энциклопедии, здесь я попытался упростить до предела понимание, вплоть до того, что некоторые детали не совсем соответствуют действительности. Я думаю, они не слишком важны на практике)

Практика

Здесь и далее  я буду использовать стандартную программу gpg, у неё конечно есть GUI (и не один), а также она работает в любых системах. И тем не менее, я настоятельно рекомендую хотя-бы один раз сделать это в консоли. Начнём мы конечно с создания пары своих ключей:


$ gpg --gen-key 
gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Выберите тип ключа:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (только для подписи)
   (4) RSA (только для подписи)
Ваш выбор (?-подробнее)? 
ключи RSA могут иметь длину от 1024 до 4096 бит.
Какой размер ключа Вам необходим? (2048) 
Запрашиваемый размер ключа 2048 бит
Выберите срок действия ключа.
         0 = без ограничения срока действительности
        = срок действительности n дней
      w = срок действительности n недель
      m = срок действительности n месяцев
      y = срок действительности n лет
Ключ действителен до? (0) 
Ключ не имеет ограничения срока действительности
Все верно? (y/N) y

Для идентификации Вашего ключа необходим User ID
Программа создаст его из Вашего имени, комментария и адреса e-mail в виде:
    "Baba Yaga (pensioner) "

Ваше настоящее имя: emulek-test
Email-адрес: emulek.bx@gmail.com
Комментарий: тест
Используется таблица символов: `utf-8'.
Вы выбрали следующий User ID:
    "emulek-test (тест) "

Сменить (N)Имя, (C)Комментарий, (E)email-адрес или (O)Принять/(Q)Выход? O
Для защиты секретного ключа необходим пароль.

Вам не нужен пароль? Это ОЧЕНЬ ПЛОХАЯ идея!
Работа будет продолжена. Вы сможете сменить пароль в любое время,
запустив данную программу с ключом "--edit-key".

Необходимо сгенерировать много случайных чисел. Желательно, что бы Вы
выполняли некоторые другие действия (печать на клавиатуре, движения мыши,
обращения к дискам) в процессе генерации; это даст генератору
случайных чисел возможность получить лучшую энтропию.

Недостаточно случайных чисел.  Выполняйте какие-либо действия для того,
чтобы ОС могла получить больше случайных данных! (Необходимо ещё 284 байт)
.+++++
.+++++
Необходимо сгенерировать много случайных чисел. Желательно, что бы Вы
выполняли некоторые другие действия (печать на клавиатуре, движения мыши,
обращения к дискам) в процессе генерации; это даст генератору
случайных чисел возможность получить лучшую энтропию.

Недостаточно случайных чисел.  Выполняйте какие-либо действия для того,
чтобы ОС могла получить больше случайных данных! (Необходимо ещё 23 байт)
.........+++++

Недостаточно случайных чисел.  Выполняйте какие-либо действия для того,
чтобы ОС могла получить больше случайных данных! (Необходимо ещё 53 байт)
.....+++++
gpg: ключ E79DF0AF помечен как абсолютно доверяемый.
открытый и закрытый ключи созданы и подписаны.

gpg: проверка таблицы доверий
gpg: 3 ограниченных необходимо, 1 выполненных необходимо, PGP модель доверия
gpg: глубина: 0  корректных:   3  подписанных:   1  доверия: 0-, 0q, 0n, 0m, 0f, 3u
gpg: глубина: 1  корректных:   1  подписанных:   0  доверия: 0-, 0q, 0n, 0m, 1f, 0u
pub   2048R/E79DF0AF 2013-07-09
Отпечаток ключа = 15A7 34D1 5C8A 0589 A8A0  F2DB 8BB8 B503 E79D F0AF
uid                  emulek-test (тест) 
sub   2048R/B60B9CA7 2013-07-09


Принцип защиты информации базируется на том, что злоумышленник никогда не узнает секретную часть ключа, потому важно, что-бы она НЕ покидала компьютер (бекапить её можно например зашифровав весь каталог ~/.gnupg, причём это можно сделать всего один раз. Этот ключ не поменяется, если вы его конечно сами не отзовёте), ну и кроме того, даже локально секретный ключ тоже шифруется паролем. Каждый раз при расшифровке и при подписывание НЕОБХОДИМО ручками этот пароль набирать. Если на другом компьютере вам понадобится ключ -- просто сделайте ещё один. Это ведь не сложно.

Следует помнить, что ВСЯ зашифрованная информация при потере секретного ключа превратится в груду бесполезного мусора.

Публичная часть ключа

В отличие от секретной части, публичную можно и нужно оставлять где угодно в широком доступе. Если злоумышленник подменит/спрячет ВСЕ публичные ключи Алисы, то Боб тоже лишится защищённого канала, если не успеет сохранить себе копию.


Только-что сделанный ключ можно преобразовать в файл такой командой:

gpg --armor --export E79DF0AF
 
Здесь E79DF0AF это идентификатор данного ключа(впрочем, можно использовать имя, мыло, или уникальные их части). Посмотреть список ключей(кольцо) можно так:

gpg --list-key
pub   2048R/E79DF0AF 2013-07-09
uid                  emulek-test (тест) 
sub   2048R/B60B9CA7 2013-07-09
 
(список секретных ключей можно смотреть с опцией --list-secret-keys). Также ключ можно и отправить на публичный сервер ключей командой

$ gpg --send-keys E79DF0AF
gpg: отправляю ключ E79DF0AF на hkp сервер pgp.mit.edu
 
Сервер ключей задан в ~/.gnupg/gpg.conf (можно задать и в команде ключом --keyserver. Принимать ключ с сервера нужно так же, но с опцией --recv-keys. За раз можно принять несколько ключей)

Ну а уж про использование ключей я расскажу в следующей части…

Часть вторая