Кіріспе
Бағдарламалық инженериядағы "Қауіпсіздікпен жобалау" дегеніміз – бағдарламалық өнімдер мен мүмкіндіктер негізінен қауіпсіз болу үшін жобаланғанын білдіреді. Бағдарламалық жобаның бастапқы кезеңінде қауіпсіздікті қамтамасыз етудің баламалы стратегиялары, тактикасы және үлгілері қарастырылады, ең тиімділері таңдалып, архитектура арқылы күшіне енгізіледі және әзірлеушілер үшін басшылық принциптер ретінде қолданылады. Қауіпсіздікке оң әсер ететін стратегиялық жобалау үлгілерін пайдалану да ұсынылады, тіпті егер олар бастапқыда қауіпсіздік үшін жасалмаған болса да. "Қауіпсіздікпен жобалау" бағдарламалық жүйелердің қауіпсіздігі мен жеке өмірге қатысты мәселелерді қамтамасыз ету үшін кең таралған даму тәсіліне айналуда. Бұл тәсілде қауіпсіздік жүйенің әр деңгейінде қарастырылады және берік архитектуралық жобалаудан басталады. Қауіпсіздік архитектурасының жобалау шешімдері белгілі қауіпсіздік стратегиялары, тактикасы және үлгілеріне негізделген, олар нақты сапалық талаптарды орындау үшін қайта пайдаланылатын әдістер ретінде анықталады. Қауіпсіздік тактикасы/үлгілері жүйе шабуылға ұшыраған кезде де қажетті аутентификация, авторизация, құпиялылық, деректердің бүлінбеуі, жеке өмірге құрмет, жауапкершілік, қолжетімділік, қауіпсіздік және жауаптан бас тартудың алдын алу талаптарын орындау үшін шешімдер ұсынады. Бағдарламалық жүйенің қауіпсіздігін қамтамасыз ету үшін ғана емес, сонымен қатар қауіпсіздіктің тұрақтылығын сақтау үшін жаңартылған қауіпсіздік стратегияларын, тактикасын және үлгілерін бағдарламалық жасақтаманы дамытумен үйлестіру қажет.
Secure by design, in software engineering, means that software products and capabilities have been designed to be foundationally secure. Alternate security strategies, tactics and patterns are considered at the beginning of a software design, and the best are selected and enforced by the architecture, and they are used as guiding principles for developers. It is also encouraged to use strategic design patterns that have beneficial effects on security, even though those design patterns were not originally devised with security in mind. Secure by Design is increasingly becoming the mainstream development approach to ensure security and privacy of software systems. In this approach, security is considered and built into the system at every layer and starts with a robust architecture design. Security architectural design decisions are based on well known security strategies, tactics, and patterns defined as reusable techniques for achieving specific quality concerns. Security tactics/patterns provide solutions for enforcing the necessary authentication, authorization, confidentiality, data integrity, privacy, accountability, availability, safety and non repudiation requirements, even when the system is under attack. In order to ensure the security of a software system, not only is it important to design a robust intended security architecture but it is also necessary to map updated security strategies, tactics and patterns to software development in order to maintain security persistence.
Шабуылдар күтілсін
Бағдарламалық жасақтамаға жасалатын зиянды шабуылдар болады деп есептелуге тиіс, және олардың салдары барынша азайтуға шара қолданылуы керек. Қауіпсіздіктегі осал тұстар мен жарамсыз пайдаланушы енгізетін деректер күтіледі. Бұл практикамен тығыз байланысты – домендік ерекшеленген дизайн немесе бұлттық технологиялар сияқты «жақсы» бағдарламалық жасақтаманы жобалау арқылы осал тұстардың ашылу қателіктерінің қаупін азайту, осылайша қауіпсіздікті арттыру, тіпті қолданылған жобалау принциптері бастапқыда қауіпсіздік мақсатында ойластырылмаған болса да.
Қауіпсіздікті қараңғылық арқылы болдырмау
Жалпы, жақсы жұмыс істейтін жобалар құпиялылыққа тірелмейді. Көбінесе, құпиялылық қауіптің бір бөлігін ынталандырмай, шабуылдаушылардың санын азайтады. Логикасы мынадай: шабуылшы үшін күрделілік артса, мақсатқа қол жеткізуге жұмсалатын күш-жігер оларды тоқтатуға мүмкіндік береді. Бұл тәсіл қауіпті азайтуға көмектеседі, бірақ уақыт өте келе қолданылатын қауіп-қатерлер мен техникалардың шексіз саны көптеген құпиялылық әдістерін күңкіртетуі мүмкін. Қауіпсіздік міндетті емес, бірақ дұрыс қауіпсіздік дегеніміз – дизайнды әркімнің білуіне және түсінуіне мүмкіндік беру, өйткені ол қауіпсіз. Бұл компьютерлік кодты көптеген адамдар қарастыра алатынын білдіреді, бұл кез келген қателерді ертерек табу ықтималдығын арттырады (Линус заңы). Кері жағы – шабуылшылар да кодты қолға түсіріп, оларға әсер ететін осал жерлерді табуды жеңілдете алады. Дегенмен, көпшілік пікір бойынша, ашық компьютерлік кодтың артықшылығы кемшілігінен басым.
Ең аз артықшылықтар
Сонымен қатар, барлық нәрсе мүмкіндігінше ең аз құқықтармен жұмыс істеуі маңызды (ең аз құқықтар принципін қараңыз). Мысалы, әкімшілік пайдаланушы ("root" немесе "admin") ретінде іске қосылған веб-серверде файлдар мен пайдаланушыларды жою құқығы болуы мүмкін. Мұндай бағдарламадағы қателік бүкіл жүйені қауіпке тікелей ұшыратады, ал оқшауланған ортада жұмыс істейтін және тек қажетті желілік және файлдық жүйе функцияларына ғана құқықтары бар веб-сервер, егер оны қоршаған қауіпсіздіктің өзі де бұзылса ғана, іске қосылған жүйені бұзуы мүмкін.
Әдістемелер
Қауіпсіз жобалау даму өмірінің барлық кезеңдерінде ескерілуі керек (қай даму әдістемесі таңдалмасын). Алдын ала құрастырылған «Қауіпсіздікпен жобалау» даму әдістемелері де бар (мысалы, Microsoft Security Development Lifecycle).
Сервер/клиенттік архитектуралар
Сервер/клиенттік архитектурада екінші жақтағы бағдарлама авторизацияланған клиент болмауы мүмкін, ал клиенттің сервері авторизацияланған сервер болмауы мүмкін. Тіпті егер олар авторизацияланған болса да, ортадағы адам шабуылы байланысты бұзуы мүмкін. Клиент/сервер жүйесінің қауіпсіздігін бұзудың ең оңай жолы – қауіпсіздік механизмдеріне тікелей шабуыл жасау емес, керісінше оларды айналып өту. Ортадағы адам шабуылы – мұның қарапайым мысалы, себебі оны пайдаланушының кімлігін қабылдау үшін мәліметтерді жинауға болады. Сондықтан, шифрлау, хэштеу және басқа да қауіпсіздік механизмдерін жобалау маңызды, сонда жиналған ақпараттың нәтижесінде шабуылдаушы қол жеткізе алмайды. Клиент-сервер қауіпсіздігін жобалаудың тағы бір маңызды ерекшелігі – сапалы кодтау практикасы. Мысалы, клиент және брокер сияқты белгілі бағдарламалық құрылымды қолдану, берік негізі бар жақсы құрылымды жобалауға көмектеседі. Сонымен қатар, егер бағдарламалық құралды болашақта өзгерту қажет болса, клиент пен сервердің логикалық бөлінісін сақтау одан да маңызды. Себебі, егер бағдарламашы бағдарламаның динамикасын толық түсінбесе, ол қауіпсіздікке қатысты кемшіліктерге әкелетін өзгерістер енгізуі мүмкін. Ең жақсы жобаланған жүйеде де мұндай оқиғаға мүмкіндік бар, бірақ жоба стандартталған сайын, оның пайда болу ықтималдығы төмендейді.