Jestem również programistą i oto moja opinia:
Problem jest gorszy niż myślisz
Nie ma łyżki
Rozwój nie polega na oprogramowanie. Rozwój polega na tworzeniu lub ulepszaniu produktów, usług i procesów. Oprogramowanie jest ważnym narzędziem, ale nie jedynym. Dobrzy programiści zdefiniują procesy w szerszym sensie, aby wiedzieć, które komponenty oprogramowania stworzyć, a także zaproponować ludzki, logistyczny proces zarządzania ryzykiem. Nie ma sensu opracowywanie systemu oprogramowania zależnego od procesów ludzkich, logistycznych i papierowych, które nie są wdrażane.
Nie ma żadnych zasad tworzenia oprogramowania, ponieważ program definiuje zasady. To właśnie sprawia, że programowanie jest najgorszym środowiskiem do zabezpieczenia.
Ale to nie znaczy, że nie należy wprowadzać pewnych kontroli. Wręcz przeciwnie, wiele mechanizmów kontrolnych powinno być skonfigurowanych przez sam zespół programistów.
Proces inżynieryjny
Istnieją firmy, które opowiadają się za oddzieleniem biznesu od technologii w procesie odgórnym. Jest to rzeczywiście bardzo popularne, ponieważ sugeruje, że ludzie biznesu bez wiedzy technicznej powinni być na szczycie. Leniwi ludzie to uwielbiają . Ale w inżynierii projekt odgórny po prostu nie działa. Feyman (1985) napisał o tym fajny artykuł w prezydenckiej komisji, która przeanalizowała eksplozję Challengera. Zasadniczo inżynieria odgórnych procesów ostatecznie psuje firmę. Moje doświadczenie rynkowe wzmacnia to zrozumienie.
Eksplozja Challengera jest doskonałym przykładem. Menedżerowie NASA zeznają przed kamerą w komisji śledczej, że opracowali gumę, która może pozostać elastyczna poniżej 60 stopni poniżej zera. Stało się to sprzeczne z prostym fizycznym eksperymentem przeprowadzonym w liceum przez jednego z komisarzy (wkład gumowy do lodowatej wody dociśniętej klamrą). To był świetny przykład, ponieważ ten element gumowy musiał być elastyczny, aby wzmacniacz nie eksplodował; ponieważ do tego potrzebne były letnie temperatury, wzmacniacz działał tylko latem. Charakterystyka pojedynczego komponentu definiuje widoczną cechę całego produktu, która jest bardzo ograniczająca.
Inżynieria powinna odbywać się oddolnie, ponieważ musisz znać ograniczenia i słabości każdego komponentu, aby opracować procesy w celu ich złagodzenia . Najczęściej procesy łagodzenia skutków nie są oprogramowaniem i mają wpływ na koszt produktu. Oznacza to, że cechy i ograniczenia poszczególnych komponentów będą określać cechy produktów, usług i procesów.
Procesy odgórne są zasadniczo zepsute. Wiele firm, które przejmują tę filozofię na papierze, nadal odnosi sukcesy rynkowe. Ale kiedy zejdziesz na dół i zbadasz ich duże i najbardziej udane projekty, dowiesz się, że były prowadzone poza normalnymi zasadami firmy. Największe sukcesy osiąga się, gdy jedna osoba, która ma głęboką wiedzę inżynierską i wizję rynkową, ma nieformalne uprawnienia. Ponieważ dzieje się to nieformalnie, kierownictwo uważa, że proces odgórny działa. Zaznaczają, że wszystkie inne zespoły są niekompetentne. Przymykając oczy na fakt, że początkowy zarys projektu po opuszczeniu „fazy szczytowej” został całkowicie zignorowany i nie opisuje zbudowanych produktów, usług i procesów.
Twój menedżer może zdefiniować, że do końca miesiąca skonstruujesz urządzenie teleportacyjne, ponieważ doszedł do wniosku, że pozwoli to na wysoki zysk w branży turystycznej ... ale to nie sprawi, że tak się stanie. Takie są projekty odgórne, stawiaj oczekiwania, które nie są technicznie uzasadnione.
Nie zrozum mnie źle, dobrze jest widzieć problem z wielu perspektyw. Analiza oddolna, odgórna, SWOT i inne są dobre dla analizy, ale prawdziwy wysiłek inżynieryjny jest oddolny. Nie ma prawdziwego celu bez wykonalności technicznej.
Bezpieczeństwo rozwoju
Musimy pamiętać, że programiści będą regularnie zmieniać oprogramowanie firmy, dzięki czemu mogą: zmieniać to, co pojawia się na ekranie każdego, wysyłać automatyczne e-maile do każdego, w tym do siebie samego, lub otwierać tylne drzwi, aby robić, co chcą. Oznacza to, że przestępca zatrudniony jako programista może wyrządzić firmie znaczne szkody.
Co gorsza, jest wiele firm, które nie egzekwują proweniencji repozytorium kodu źródłowego, a następnie wynajęty programista może dostarczyć plik binarny inny niż podane źródło. Pozwala to przestępczym programistom na przejęcie firmowych systemów, jeśli nie zostaną zatrudnieni, wszystko wkrótce przestanie działać.
Dla mnie bezpieczeństwo programowania powinno skupiać się na:
- Kontrola wersji kodu źródłowego : zapewnienie, że kod źródłowy i potrzebne komponenty trzeciej części są przechowywane w bezpiecznym miejscu.
- Strategiczny podział pracy : młodszy i tymczasowy programiści muszą mieć ograniczony dostęp do kodu źródłowego i danych. Potrzebują jedynie dostępu do komponentów, które zmieniają, aby młodszy programista nie był w stanie zrozumieć wewnętrznego działania wszystkich systemów i móc to wykorzystać.
- Zaufaj głównym programistom : programiści senior / Core będą musieli wiedzieć wszystko, mieć do wszystkiego dostęp, planować i rozprowadzać zadania oraz diagnozować poważne problemy. Ten rdzeń musi mieć dostęp do całości, zarówno w fazie rozwoju, jak i produkcji. Są twoimi partnerami w tworzeniu polityk bezpieczeństwa. Musimy zaakceptować fakt, że główni programiści są właścicielami firmy. Mój stary szef mawiał: "Mamy szczęście, że Lucas jest po naszej stronie, po drugiej stronie by nas zniszczył". Główni programiści mogą wyrządzić wiele szkód, jeśli chcą, i nie ma zapory sieciowej ani kontroli produkcji, które mogą temu zapobiec.
- Oddziel środowisko za pomocą zapór ogniowych : oddziel swoją sieć programistyczną od Twoja sieć testowa, z Twojej sieci produkcyjnej. W firmie zdefiniowałem sieć 10.1. jako rozwój, 10.2. jako testowanie i 10.3. jako produkcja. Sieci 10.2 i 10.3 otrzymują kod tylko przez korporacyjny CVS i tworzą go automatycznie na polecenie administratora. Mimo, że był to mały start-up i byłem na produkcji i w zespołach programistycznych, zrobiłem kilka biurokracji, aby uniknąć własnych błędów (deweloperzy mogą być Twoimi najlepszymi sprzymierzeńcami). Zmieniłem również kolory terminali według sieci: podczas łączenia się z serwerem produkcyjnym tło terminala było czerwone, testowanie było żółte, a programistyczny zielony. Ponieważ wszystkie moje serwery korzystały z tej samej konfiguracji, łatwo było je pomylić, jeśli monit był otwarty. Z mojego doświadczenia wynika, że większość problemów wynika ze źle przetestowanego oprogramowania i nowych instalacji oprogramowania. Dla jasności: moim zdaniem to, gdzie jesteś, jest potężną funkcją bezpieczeństwa. Nie ma to nic wspólnego z dostępem, ale jest to bezpieczeństwo.
- Zatrudnij wykwalifikowanego programistę testów : kluczowym aspektem testowania jest posiadanie dużej ilości dobrych symulowanych danych, które są istotne dla problemów, z którymi boryka się firma. Symulacje Monte-Carlo są dobre do generowania dużych zbiorów danych, które mają znaczenie dla innych programistów i mogą prowadzić do silniejszego i odporniejszego oprogramowania i procesów. Dla mnie nie ma błędów „produkcyjnych”, zawsze winny jest deweloper. Należy spisać zadania związane z konserwacją i nieprzewidziane okoliczności. Oprogramowanie musi być odporne.
- Przegląd kodu źródłowego : poproś ludzi o przejrzenie kodu źródłowego przed zaakceptowaniem modyfikacji. Wszystkie projekty powinny być rozgałęzione na kontrolę kodu źródłowego, a scalanie powinno zostać sprawdzone. Przegląd kodu źródłowego powinien zajmować się tylko wykrywaniem złośliwego oprogramowania, eskalacją dostępu, profilami dostępu i dobrym wyjaśnieniem, co kod źródłowy oznacza i powinien robić. Jakość kodu zostanie zapewniona poprzez testowanie, a nie przegląd kodu źródłowego. Można to zobaczyć w akcji w większości projektów open source.
- Testy Polityki testowania są znacznie bardziej kulturą korporacyjną niż strukturą. Niektóre firmy przyjmują ramy rynkowe, przeprowadzają testy, ale jakość ich kodu jest zła. Dzieje się tak, ponieważ potrzebujesz ludzi zdolnych do tworzenia znaczących testów. W rzeczywistości rozwój musi być sterowany testami. Nie znam innej bezpiecznej drogi rozwoju. Ciekawe jest to, że ludzie, zakupy i doradztwo również muszą zostać przetestowane. Sprzedawcy często twierdzą, że ich produkty działają bez zarzutu, ale ja jeszcze nie znalazłem produktu bez wad.
- Zasady są bez znaczenia, jeśli nie są monitorowane . Pewna firma, którą znam, ma biurokrację, że każda tabela bazy danych powinna mieć opis na poziomie atrybutów. 95% atrybutów jest opisanych jako „$ {nazwa atrybutu} z $ {nazwa tabeli}”. Nie wyjaśnia, czym naprawdę jest ten atrybut, jakie wartości mogą posiadać i tak dalej.
- Odpowiednie wynagrodzenie i środowisko pracy . Aby mieć dobrych programistów, zarówno pod względem umiejętności, jak i osobowości, musisz mieć dobrą politykę wynagrodzeń. Pieniądze są oczywiście ważne, ale to nie wszystko. Musisz także mieć perspektywę / stabilność, prawdziwe uznanie i dobre środowisko pracy. Na przykład zamiast w biurze deweloperskim w Nowym Jorku, w którym ludzie mieszkają w małych mieszkaniach, można wybrać mniejsze miasto, w którym taka sama rekompensata pozwala na większy dom i bliskość miejsca pracy. Większe komputery, dobre laboratoria to także plus dla entuzjastów technologii.
- Bezpieczeństwo danych wiele czynności wymaga wrażliwych danych produkcyjnych i powinno się do nich dostać w specjalnym laboratorium. O ile informacje nie są publiczne lub nie są poufne, być może najlepszą polityką jest umieszczenie laboratoriów w dobrych okolicach z kontrolowanym dostępem fizycznym. Zezwalaj na umieszczanie tylko niektórych symulowanych danych na osobistych laptopach i komponentach, które nie są wrażliwe. To jest możliwe. Na przykład opracowałem 4,5 miliarda rekordów archiwum danych, do których dostęp jest ciężki, dla firmy. Zrobiłem w domu i nie wykorzystałem do tego celu żadnych danych firmowych. Kiedy przesłałem kod, działał zgodnie z oczekiwaniami za pierwszym razem. Oprócz awarii sprzętu i migracji środowisk produkcyjnych mamy 100% dostępności w ciągu 10 lat. Ryzyko, że programista zabierze ze sobą kod źródłowy, nie ma znaczenia. Opracowanie tego konkretnego systemu zajęło mi 3 miesiące, większość tego czasu poświęcono na zrozumienie ograniczeń wydajności komponentów. To jest teraz wiedza w mojej głowie. Nawet bez kodu źródłowego mogę ponownie opracować to rozwiązanie w ciągu około tygodnia.
- Silne dzienniki są ważne, aby wiedzieć, kto coś zrobił. Najlepiej jest generować dzienniki przez framework, rejestrując przez krótki czas szczegółowe ekrany, dla dłuższego dostępu i działań, a nawet dłuższe dzienniki korporacyjne. Moje krytyczne systemy rejestrują się za każdym razem, gdy uzyskuje się dostęp do ekranu (w tym projekt ekranu). Niektóre z krytycznych zasobów powinny być rejestrowane przez wyzwalacz w samej bazie danych, a krytyczne tabele lub zasoby powinny być oznaczone do kontroli kodu źródłowego.
- Sprawdzanie dziennika jest trudne do wykonania ręcznie. Dowiedz się, jak tworzyć filtry w dziennikach, aby zobaczyć krytyczne rzeczy. Bardzo przydatnym filtrem jest krzyżowanie zgłoszeń skarg z dostępem i działaniami użytkowników. Jeśli masz wystarczająco dobre dzienniki, zobaczysz zbiegi okoliczności. Na przykład: przed wystąpieniem problemu użytkownik1 zawsze się loguje.
Informacje o braku dostępu do produkcji
Zasady, które wymagają od programistów dostępu do systemów produkcyjnych, ponieważ użytkownicy są po to, aby uniknąć przesłanie kodu w celu pokazania uprzywilejowanej informacji jego własnemu użytkownikowi. Myślę, że jest to bardzo, bardzo słaby środek bezpieczeństwa i łatwy do wykrycia podczas audytu kodu źródłowego. Jest kilka łatwych sposobów obejścia tego:
- programista plus jeden nisko opłacany pracownik;
- wyślij sobie e-mail;
- otwórz tylne drzwi w systemie.
Audyt kodu źródłowego pod kątem backdoorów, eskalacji dostępu i złośliwego oprogramowania wydaje się bardziej produktywny. Pozwala zidentyfikować złych programistów, gdy testują swoje exploity i zwolnić ich. Oczywiście wykwalifikowany programista może ukryć exploita na widoku, dlatego ważne jest, aby używać języków i nazw zmiennych w sposób jasny i przejrzysty. Stosuj dziwne rozwiązania tylko w udokumentowanych punktach aplikacji, które wymagają specjalnej wydajności lub zaciemnienia. Na przykład 1 << 4 to to samo, co 1 * 16. Miałoby to sens tylko wtedy, gdyby język sam nie przeprowadzał tej optymalizacji, a miejsce, w którym to się dzieje, jest wąskim gardłem wydajności. Zbyt symboliczne języki są złe z tego samego powodu. Kod źródłowy powinien być czytelny dla każdego maniaka.
Problem jest gorszy niż myślisz
Najłatwiejsze i najgorsze szkody, jakie może spowodować programista, nie są związane z instalacją narzędzia. Nawet jeśli środowisko programistyczne jest zarządzane, nie będzie miało większego znaczenia, jeśli firma nie ma silnych zapór ogniowych, repozytoriów kodu źródłowego, kompilacji opartych wyłącznie na repozytoriach kodu źródłowego i przeglądzie kodu.