RAND_bytes() failed — бир жергиликтүү примитив жөнүндө билдирүү, эсеп, алдын ала бөлүшүлгөн ачкыч же алыскы порт жөнүндө эмес. Эки такыр башка бузулуу бирдей сапты чыгарат жана ар башка из калтырат. Бири байт чыгаруудан баш тарткан криптографиялык бэкенд; экинчиси өз коду курулган энтропия булагына жете албаган процесс. Аларды ажыратуу үчүн каталар кезегин бир жолу окуу жана камактагы процесстин файлдык тутум көрүнүшүнө бир кароо керек, жана бул текшерүү /dev астында бир нерсе түзүлө электе аткарылышы керек.

Кайтарылуучу маани эмнени ажыратат

Документтелген келишим эки эмес, үч натыйжаны ажыратат: ийгилик үчүн 1, жүктөлгөн RAND ыкмасы сурамды колдобосо -1 жана башка бузулуулар үчүн 0, түшүндүрмө каталар кезегинде калат. RAND_bytes шилтемеси көз жаздымда калышы мүмкүн болгон пунктту кошот: демейки генератор колдоого алынган платформаларда операциялык тутумдан урук алат, жана бул уруктоо ишке ашпаса, ал болжолдуу байттарды кайтаруунун ордуна ката абалында калат.

Бул сандардын бирөө гана чөйрөнү сүрөттөйт. -1 куруу, жеткирүүчү же функция маселеси, анткени код активдүү ишке ашыруу сунуштабаган нерсени сурады. Уруктоо дагыны менен келген 0 — чөйрө маселеси, анткени генератор энтропияны такыр ала алган жок. Сандын өзү кайсы экенин эч качан айтпайт, функциянын аталышы да айтпайт.

Жашырылган түзмөк түйүнү чыныгы себеп болгондо

Чектелген кызмат сиз терип жаткан кабыктан башка даракты көрөт. Chroot түрмөлөрү, контейнер сүрөттөрү жана катууланган unit файлдары адатта хосттукунан аз түйүн камтыган /dev сунуштайт. Эгер ишке ашпаган ишке ашыруу /dev/urandom файлын жол аталышы боюнча ачса, бул айырма хосттун өзү толук соо көрүнгөндө иштетүүнү бузууга жетет. Түрмөдөн тышкары жашаган түзмөк камактагы процесстин эмнени ачууга укуктуу экени жөнүндө эч нерсени далилдебейт.

Бирок ар бир туш келди интерфейске жол керек эмес. Linuxтеги getrandom тутумдук чакыруу файл аталышын да, файл дескрипторун да кабыл албайт, жана анын колдонмо бети бул касиет дал chroot түзмөк жолдорун жашырган жерде пайдалуу экенин белгилейт.

Ошондуктан жок түйүн жөнүндөгү түшүндүрмө коддун бир бутагы тууралуу божомол, ал эми туш келди сандар жөнүндө жалпы эреже эмес. Далилдер жолду атаганда ал күчүндө болот, ал эми далилдер башка нерсени атаганда ал божомол бойдон калат.

Алгач каталар кезегин, анан процесстин көрүнүшүн окуңуз

Суроону чечүүнүн эң тез жолу — китепкана мурун эле жазган нерсени окуу, анан түрмөнүн ичиндеги көрүнүшкө түз кароо. Кызмат чындап жүктөгөн OpenSSL курулушунан баштаңыз, анткени жеткирүүчү стектери негизги версиялар жана дистрибутивдер ортосунда айырмаланат. Анан systemdден кайсы процесс иштеп жатканын жана ага кандай чектөөлөр колдонуларын сураңыз. Эки факт тең үстөлгө келгенде гана ошол процесстин көрө алган түйүндөрүн тизмелөөгө татыктуу.

openssl version -a
systemctl show openvpn-server@lab -p MainPID -p PrivateDevices -p DevicePolicy
pid=$(systemctl show -p MainPID --value openvpn-server@lab)
sudo ls -l /proc/"$pid"/root/dev/urandom /proc/"$pid"/root/dev/random

Бул окууларды ошол эле процессте аткарыңыз, кокустан ачык калган кабыкта эмес. Хосттун /dev маанисин байланышы жок процесстин көрүнүшү менен салыштыруу — туура эмес көз карандылыкты эки жолу оңдоонун жолу.

Көз карандылыкты аны атай алганда гана кошуңуз

Далилдер чындап жолду атаганда, оңдоо кичине: ошол жалгыз жолду түрмөнүн ичинде жеткиликтүү кылып, калганын тынч калтырыңыз. Бир түйүндү bind mount кылуу адатта жетиштүү, ал эми mknod түйүндүн стандарттык major жана minor номурлары менен mount мүмкүн болбогон орнотууларда ушундай эле натыйжа берет. Sandboxты кеңейтүү, ар бир белги түзмөгүнө уруксат берүү же PrivateDevices өчүрүү максаттуу оңдоону туруктуу коопсуздук регрессиясына алмаштырат.

Энтропия демону бул оңдоонун ордун баспайт. haveged сыяктуу пакеттер ядро бассейнинин кантип азыктанышын өзгөртөт; алар камактагы процесс ачууга укуктуу жолду түзө албайт. Бирөөнү орнотуу ачуу чакыруу дагы эле ишке ашпай турганда ден соолук графигин жакшырта алабы. Эки маселени өзүнчө кармаңыз, болбосо кийинки бузулуу кайрадан туура эмес катмарга таңылат.

Генераторду жана туннелди өзүнчө текшериңиз

Кайра иштетүү — бузулууга алып келген ошол эле конфигурацияны, ошол эле unit файлын жана ошол эле обочолонууну кайра колдонгон жалгыз сынак. Аны иштетиңиз, анан мурунку иштетүүдөн алынган үлгүнүн ордуна журналдын эң жаңы жазууларын окуңуз.

sudo systemctl restart openvpn-server@lab
sudo journalctl -u openvpn-server@lab --since -5min --no-pager | grep -iE 'rand|entropy|Initialization Sequence'

Ошол чыгуудан эки өзүнчө нерсени издеңиз: туш келди булак тууралуу билдирүүнүн жоголушу жана туннелдин адаттагы иштетүү баскычына жетиши. Кайра иштеген генератор бир жергиликтүү бузулууну жоёт жана сервердин идентификациясы, эсеп маалыматтары же маршруттоо тууралуу эч нерсе айтпайт. Муну мурун ишке ашпаган ошол эле кардар конфигурациясы менен сынап көрүңүз, натыйжа жөн гана жакшыраак эмес, салыштырууга боло тургандай болсун.

Тектеш макалалар