Уявімо ситуацію, коли ви розробили під Linux унікальний web-інтерфейс, написали для нього якусь програмуліну і кучу потрібних скриптів. Все це чудово працює і радує вас і замовників даного творіння.
Але може статися так, що “чисто випадково” носій даних (жорсткий диск, SSD, SD-карта) із усіма вашими php файлами і скриптами потрапляє в чужі руки. Наприклад кінцевий користувач вашого ембеддед девайса просто захоче поцікавитись вмістом SD-карти із дистрибутивом Linux і вашою програмуліною, вставивши її у карт-рідер. Під Windows (о да!) він нічого цікавого не побачить – лише кілька кілобайт із файлами завантажувального сектора. Продвинуті юсери Linux (о ні!) у папці /var/www/ (чи будь-якій іншій) зможуть ознайомитись із вашим PHP кодом і при потребі підправити його на свій розсуд. Також їм будуть доступні всі паролі до MySQL сервера, зовнішніх баз даних, і т.п. І це не є гуд!
Порившись в Інтернеті я наштовхнувся на декілька методів захисту від подібних досліджень:
– Застосовувати своє унікальне шифрування файликів, або просто довести іх до максимально нечитабельної форми. Варіант не сподобався через мороку із реалізацією і “собі ж гірше буде”
– Можливо шифрувати весь диск або розділ, який розшифровується на момент старту ОС. Непоганий, але значно падає продуктивність, що критично для вбудованих міні-серверів.
– Я знайшов утилітку ecryptfs, яка шифрує окремі каталоги і монтує їх у розшифрованому вигляді при потребі. І вона мене поки влаштовує.
Ecryptfs шифрує файлову систему вибраного вами каталогу униможливлюючи перегляд файлів (і назв файлів при потребі). Щоб розшифрувати каталог вам потрібно знати пароль або мати файл-ключ, бажано на зовнішньому носії, наприклад на флешці.
Наведу приклад шифрування каталогу /var/www/ де у мене власне і знаходиться web-інтерфейс написаний на PHP.
Ставимо утиліту:
> apt-get install ecryptfs-utils lsof |
Тепер шифруємо:
>mount -t ecryptfs /var/www/ /var/www/Select key type to use for newly created files: 1) passphrase
2) tspi Selection: 1 Passphrase: Select cipher: 1) aes: blocksize = 16; min keysize = 16; max keysize = 32 2) blowfish: blocksize = 8; min keysize = 16; max keysize = 56 3) des3_ede: blocksize = 8; min keysize = 24; max keysize = 24 4) twofish: blocksize = 16; min keysize = 16; max keysize = 32 5) cast6: blocksize = 16; min keysize = 16; max keysize = 32 6) cast5: blocksize = 8; min keysize = 5; max keysize = 16 Selection [aes]: Select key bytes: 1) 16 2) 32 3) 24 Selection [16]: Enable plaintext passthrough (y/n) [n]: Enable filename encryption (y/n) [n]: y Filename Encryption Key (FNEK) Signature [bd381e456b7cc96]: Attempting to mount with the following options: ecryptfs_unlink_sigs ecryptfs_fnek_sig=bd381e4426b7cc96 ecryptfs_key_bytes=16 ecryptfs_cipher=aes ecryptfs_sig=bd381e456b7cc96 WARNING: Based on the contents of [/root/.ecryptfs/sig-cache.txt], it looks like you have never mounted with this key before. This could mean that you have typed your passphrase wrong. Would you like to proceed with the mount (yes/no)? : yes Would you like to append sig [bd381e456b7cc96] to [/root/.ecryptfs/sig-cache.txt] in order to avoid this warning in the future (yes/no)? : yes Successfully appended new sig to user sig cache file Mounted eCryptfs |
Опції шифрування залишив стандартні, лише увімкнув шифрування назв файлів і каталогів – Enable filename encryption (y/n) [n]: y
Тепер наші файлики на диску виглядатимуть приблизно так:
>ls /var/www/ ECRYPTFS_FNEK_ENCRYPTED.FWbMNTpJP5tkdEQSOed356BDDoYeN0.fLHk93RXt- ECRYPTFS_FNEK_ENCRYPTED.FWbMNTpJP5tkdEQSOed356BDDoYeN0.fLHk97vIZL ECRYPTFS_FNEK_ENCRYPTED.FWbMNTpJP5tkdEQSOed356BDDoYeN0.fLHk983SH ECRYPTFS_FNEK_ENCRYPTED.FWbMNTpJP5tkdEQSOed356BDDoYeN0.fLHk994Yk |
Щоб мати можливість все це розшифрувати знову ж таки запускаємо утиліту у ecryptfs із наступними параметрами:
>mount -t ecryptfs /var/www/ /var/www/ -o key=passphrase,ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_passthrough=n,ecryptfs_enable_filename_crypto=y,passphrase_passwd=Ваш пароль |
Все чудово працює.
Єдине, що я виявив один прикрий момент. Не знаю чи це баг чи фіча утіліти, але після команди розшифрування папки у логах /var/log/messages з’явиться наступний неприємний запис “ecryptfs_parse_options: eCryptfs: unrecognized option [passphrase_passwd=Ваш пароль]“! Що підло викриває ваш пароль шифрування.
Щоб цього позбутися можливо відразу витирати останню стрічку даного логу, наприклад за допомогою наступної команди:
sed -i ‘$ d’ /var/log/messages |
Користуйтеся. Приємної роботи!