Запись неизменяемых данных

Добрый день.

Прошу пояснить правильность моих действий: хочу записать на Rutoken ECP пользовательские данные так, чтобы возможно было только их чтение.

Пишу: pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l --pin 12345678 --write-object ./myfile.txt --type data --label "MYFILE"

Читаю: pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --read-object --type data --label 'MYFILE' --output-file myfile_read.txt

Но потом записать могу и без пароля (пина) - можно ли запретить такое поведение ?

Re: Запись неизменяемых данных

Здравствуйте, muzi,
Уточните пожалуйста, вам необходимо чтоб при записи данных всегда запрашивался PIN-код или на чтение данных запрашивался PIN-код?
Опишите подробнее какая перед вами стоит задача.

Re: Запись неизменяемых данных

Добрый день

Опишу вашу задачу на уровне атрибутов PKCS#11 -- http://docs.oasis-open.org/pkcs11/pkcs1 … 40-os.html.


Вы хотите, чтобы:
1. Объект читался только по предъявлению PIN-кода
2. Объект нельзя было изменять


За возможность чтения объекта по предъявлению PIN-кода отвечает атрибут CKA_PRIVATE. Если он установлен в CK_TRUE, то без авторизации на токене найти объект будет нельзя.

За возможность изменения объекта отвечает атрибут CKA_MODIFIABLE. Если этот атрибут установлен в CK_FALSE, то объект помечается как read-only и дальнейшее изменение ВСЕХ его атрибутов невозможно. Любая попытка изменить объект будет приводить к ошибке CKR_ATTRIBUTE_READ_ONLY.


Таким образом ваша задача сводится к созданию объекта с таким шаблоном атрибутов:

{
    { CKA_CLASS, &dataObject, sizeof(dataObject) },
    { CKA_APPLICATION, applicationLabel, sizeof(applicationLabel) - 1 },  // Описание приложения, которое записывает данные
    { CKA_MODIFIABLE, attributeFalse, sizeof(attributeFalse) },
    { CKA_PRIVATE, attributeTrue, sizeof(attributeTrue) },
    { CKA_VALUE, data, sizeof(data) }, // сами данные
}

pkcs11-tool позволяет задавать только эти атрибуты:
1. CKA_CLASS (флаг --type)
2. CKA_APPLICATION (флаг --aplication-label)
3. CKA_PRIVATE (флаг --private)
4. CKA_VALUE (флаг -w)

Так что если вы все-таки хотите добиться неизменяемости объекта, то атрибут CKA_MODIFIABLE вам придется устанавливать программным способом.

Re: Запись неизменяемых данных

Добрый день.

Уточняю задачу (извиняюсь если сразу написал неясно):

1. Необходимо записать, использую PIN, небольшой файл (действие выполнит "установщик")
2. При работе пользователь должен иметь возможность считать эти данные
3. Пользователь не должен иметь возможность перезаписать данные (т.к. не знает PIN)

Делаю так:
1. pkcs11-tool --module /usr/lib/librtpkcs11ecp.so  -l --pin 12345678 --write-object ./admin_file.txt --type data --label "MYFILE"
2. pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --read-object --type data --label 'MYFILE' --output-file ./some_file.txt
3. Но пользователь может записать свой файл под темже label так:  pkcs11-tool --module /usr/lib/librtpkcs11ecp.so  --write-object ./user_file.txt --type data --label "MYFILE"
3.1 После такой записи --list-objects покажет две записи с одинаковым label

Хотя, если  пользователь и записал свой файл под темже label, то содержимое будет как у admin_file.txt

Это почти хорошо, но хотелось бы запретить запись пользователю свои данные под темже label (возможно следует использовать --application-label, но назначение этих ключей еще не понимаю)

Re: Запись неизменяемых данных

Теперь понял вашу задачу.

К сожалению модель доступа к объектам pkcs#11 не дает возможность создавать объекты, которые
1. могут читаться без PIN-кода.
2. модифицироваться после получения PIN-кода.

Вы или создаете объект, который может видеть (+ возможно изменять) только авторизованный пользователь, или все пользователи.

К счастью, это ограничение можно обойти с помощью криптографии, причем используя криптопровайдер внутри Рутокена.

1. Попробуйте сгенерировать ключевую пару на токене

pkcs11-tool --module ./librtpkcs11ecp.so --key-type RSA:2048 --keypairgen --id 45 -l --pin 12345678

2. Подпишите на ней данные, которые вы хотите использовать:

pkcs11-tool --module /usr/lib/librtpkcs11ecp.so  -s --id 45 -l --pin 12345678 -i data.txt -o sign.txt

3. Загрузите подпись и данные в качестве CKO_DATA объектов на токен

pkcs11-tool --module /usr/lib/librtpkcs11ecp.so  --write-object data.txt --application-label "app-data" --type data
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so  --write-object sign.txt --application-label "app-sign" --type data

Дальше, если вы захотите проверить, что объект не изменялся, просто проверьте его подпись:

pkcs11-tool --module /usr/lib/librtpkcs11ecp.so  --read-object --type data --application-label "app-sign" -o sign.txt
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so  --read-object --type data --application-label "app-data" -o data.txt
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so  --verify --id 45 -i data.txt --signature-file sign.txt

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

Проблему того, что пользователь может создавать несколько объектов с одинаковым CKA_LABEL и CKA_ID обойти нельзя: стандарт не запрещает это. В то же время, если вы выгрузили данные и подпись для них сошлась, то этим данным точно можно доверять.

Re: Запись неизменяемых данных

Спасибо за развернутый ответ !