Sono anche uno sviluppatore e questa è la mia opinione:
Il problema è peggiore di quanto pensi
Non c'è cucchiaio
Lo sviluppo non riguarda Software. Lo sviluppo riguarda la creazione o il miglioramento di prodotti, servizi e processi. Il software è un ingranaggio importante ma non è l'unico. I bravi sviluppatori definiranno i processi in senso più ampio per sapere quali componenti software creare e quale processo umano, logistico e di gestione del rischio proporre. Non ha alcun senso sviluppare un sistema software che dipenda da processi umani, logistici e cartacei che non vengono implementati.
Non ci sono regole per lo sviluppo perché lo sviluppo sta definendo le regole. Questo è ciò che rende lo sviluppo l'ambiente peggiore da proteggere.
Ma questo non significa che alcuni controlli non dovrebbero essere stabiliti. Al contrario, molti controlli dovrebbero essere impostati dallo stesso team di sviluppo.
Processo di progettazione
Ci sono aziende che sostengono la separazione tra business e tecnologia in un processo dall'alto verso il basso. Questo è in realtà molto popolare perché suggerisce che gli uomini d'affari senza conoscenze tecniche dovrebbero essere in cima. I pigri lo adorano . Ma in ingegneria un design top-down semplicemente non funziona. Feyman (1985) ha scritto un bell'articolo a riguardo nella commissione presidenziale che ha analizzato l'esplosione del Challenger. Fondamentalmente l'ingegnerizzazione dei processi top-down alla fine distrugge l'azienda. E la mia esperienza di mercato rafforza questa comprensione.
L'esplosione del Challenger è un ottimo esempio. I dirigenti della Nasa testimoniano davanti alla telecamera su una commissione d'inchiesta di aver sviluppato una gomma che può rimanere flessibile sotto i 60 gradi sotto lo zero. Cosa che è stata contraddetta da un semplice esperimento fisico di scuola superiore fatto da uno dei commissari (mettere il componente in gomma in acqua ghiacciata pressato da una pinza). Questo è stato un ottimo esempio perché questo componente in gomma doveva essere flessibile affinché il booster non esplodesse; poiché aveva bisogno delle temperature estive per farlo, il booster funzionava solo in estate. Una caratteristica di un singolo componente definisce una caratteristica visibile dell'intero prodotto che è molto limitante.
L'ingegneria dovrebbe avvenire dal basso verso l'alto perché è necessario conoscere i limiti e le debolezze di ogni componente per elaborare processi per mitigarli . Il più delle volte, i processi di mitigazione non sono software e incideranno sul costo del prodotto. Ciò significa che le caratteristiche e le limitazioni dei singoli componenti definiranno le caratteristiche dei prodotti, servizi e processi.
I processi top-down sono fondamentalmente interrotti. Molte aziende che adottano questa filosofia sulla carta hanno ancora un certo successo di mercato. Ma quando si scende e si studiano i loro progetti più grandi e di maggior successo, si scopre che sono stati condotti al di fuori delle normali regole aziendali. I maggiori successi si ottengono quando una persona che ha una profonda conoscenza ingegneristica e una visione del mercato è informalmente autorizzata. Poiché ciò avviene in modo informale, la direzione ritiene che il processo dall'alto verso il basso funzioni. Dicono che tutte le altre squadre sono incompetenti. Chiudere un occhio sul fatto che lo schema iniziale del progetto quando è uscito dalla "fase superiore" è stato completamente ignorato e non descrive i prodotti, i servizi e i processi realizzati.
Il tuo manager può definire che progetterai un dispositivo di teletrasporto entro la fine del mese perché ha concluso che ciò consentirà un elevato profitto nel settore dei viaggi ... ma ciò non lo realizzerà. I progetti dall'alto verso il basso sono così, stabiliscono aspettative che non sono tecnologicamente valide.
Non fraintendetemi, è bello vedere il problema da molti punti di vista. Bottom-up, Top-down, SWOT e altro sono salutari per l'analisi, ma il vero sforzo di ingegneria è dal basso verso l'alto. Non esiste un vero obiettivo senza la fattibilità tecnica.
Sicurezza nello sviluppo
Dobbiamo ricordare che gli sviluppatori di software cambieranno regolarmente il software aziendale e, in questo modo, potranno: cambiare ciò che appare sullo schermo di chiunque, inviare e-mail automatizzate a chiunque, inclusi loro stessi, o aprire backdoor per fare ciò che vogliono. Ciò significa che un criminale assunto come sviluppatore può arrecare danni significativi all'azienda.
Peggio ancora, ci sono molte aziende che non impongono la provenienza di un repository di codice sorgente e quindi lo sviluppatore assunto può fornire un binario diverso dalla sorgente fornita. Ciò consente agli sviluppatori criminali di dirottare i sistemi aziendali, se non vengono assunti, le cose smetteranno di funzionare presto.
Per me la sicurezza dello sviluppo dovrebbe concentrarsi su:
- Controllo della versione del codice sorgente : per garantire che il codice sorgente e i componenti di terze parti necessari siano archiviati in un luogo sicuro.
- Divisione strategica del lavoro : junior e temporanea gli sviluppatori devono avere un accesso limitato al codice sorgente e ai dati. Hanno solo bisogno di accedere ai componenti che stanno cambiando per evitare che uno sviluppatore junior sia in grado di comprendere il funzionamento interno di tutti i sistemi ed essere in grado di sfruttarlo.
- Fidati degli sviluppatori principali : gli sviluppatori senior / core dovranno sapere tutto, avere accesso a tutto, pianificare e distribuire le attività e diagnosticare problemi gravi. Questo nucleo deve avere accesso a tutto, sia nello sviluppo che nella produzione. Sono i tuoi partner nello sviluppo delle politiche di sicurezza. Dobbiamo accettare che gli sviluppatori principali siano i proprietari dell'azienda. Il mio vecchio capo diceva: "siamo fortunati che Lucas sia dalla nostra parte, dall'altra ci distruggerebbe". Gli sviluppatori principali possono causare molti danni se lo desiderano e non esistono firewall e controlli di produzione che possano impedirlo.
- Separa l'ambiente tramite firewall : separa la tua rete di sviluppo, da la tua rete di test, dalla tua rete di produzione. Su un'azienda ho definito la rete 10.1. come sviluppo, 10.2. come test e 10.3. come produzione. Le reti 10.2 e 10.3 ricevono codice solo tramite il CVS aziendale e le creano automaticamente su comando admin. Sebbene fosse una piccola startup e io fossi nella produzione e nei team di sviluppo, ho fatto alcune burocrazie per evitare i miei errori (gli sviluppatori possono essere i tuoi migliori alleati). Ho anche cambiato i colori del terminale in base alla rete: quando mi collegavo a un server di produzione lo sfondo del terminale era rosso, il test era giallo e lo sviluppo verde. Poiché tutti i miei server utilizzavano la stessa configurazione, era facile confonderli se il prompt era aperto. In base alla mia esperienza, la maggior parte dei problemi deriva da software mal testato e nuove installazioni di software. Per essere chiari: dove ti trovi è una potente funzionalità di sicurezza secondo me. Non ha nulla a che fare con l'accesso, ma è la sicurezza.
- Assumere un esperto sviluppatore di test : l'aspetto chiave del test è disporre di grandi quantità di buoni dati simulati che siano significativi per i problemi che l'azienda deve affrontare. Le simulazioni Monte-Carlo sono utili per generare set di dati di grandi dimensioni che hanno un significato per altri sviluppatori e possono portare a software e processi più forti e resilienti. Per me non ci sono errori di "produzione", la colpa è sempre dello sviluppatore. Le attività di manutenzione e gli imprevisti devono essere scritti. Il software deve essere resiliente.
- Revisione del codice sorgente : chiedi alle persone di rivedere il codice sorgente prima di accettare la modifica. Tutti i progetti dovrebbero essere ramificati sul controllo del codice sorgente e l'unione dovrebbe essere rivista. La revisione del codice sorgente dovrebbe preoccuparsi solo del rilevamento del malware, dell'escalation degli accessi, dei profili di accesso e di una buona spiegazione di cosa significa e dovrebbe fare il codice sorgente. La qualità del codice sarà assicurata dal test, non dalla revisione del codice sorgente. Puoi vederlo in azione nella maggior parte dei progetti open source.
- I test delle policy di test sono molto più una cultura aziendale che un framework. Alcune aziende adottano framework di mercato, eseguono alcuni test, ma la qualità del loro codice è pessima. Ciò accade perché hai bisogno di persone in grado di progettare test significativi. In realtà lo sviluppo deve diventare test driven. Non conosco altro modo sicuro di sviluppo. E una cosa curiosa è che anche gli esseri umani, gli acquisti e le consulenze devono essere testati. I fornitori spesso affermano che i loro prodotti funzionano in modo impeccabile, ma non ho ancora trovato un prodotto impeccabile.
- Le norme non hanno senso se non vengono monitorate . Una società che conosco ha una burocrazia secondo cui ogni tabella di database dovrebbe avere una descrizione a livello di attributo. Il 95% degli attributi è descritto come "il $ {nome attributo} di $ {nome tabella}". Non spiega cosa sia realmente l'attributo, quali valori possono contenere e cose del genere.
- Retribuzione e ambiente di lavoro adeguati . Per avere buoni sviluppatori, sia per abilità che per personalità, devi avere buone politiche di compensazione. Il denaro è importante, ovviamente, ma non è sufficiente. Devi anche avere prospettiva / stabilità, vero riconoscimento e un buon ambiente di lavoro. Ad esempio, invece in un ufficio di sviluppo a New York dove le persone vivono in piccoli appartamenti, puoi scegliere una città più piccola dove lo stesso compenso consente una casa più grande e una maggiore vicinanza al lavoro. Computer più grandi, buoni laboratori sono anche un vantaggio per gli appassionati di tecnologia.
- Sicurezza dei dati molte attività richiedono dati di produzione sensibili e dovrebbero essere accessibili in un laboratorio speciale. A meno che le informazioni non siano pubbliche o non sensibili, forse la migliore politica è mettere i laboratori in buoni quartieri con accesso fisico controllato. Consentire l'inserimento solo di alcuni dati simulati su laptop personali e componenti non sensibili. È possibile. Ad esempio, ho sviluppato un archivio di dati di 4,5 miliardi di record con accesso pesante per un'azienda. L'ho fatto a casa mia e non ho utilizzato assolutamente dati aziendali a tal fine. Quando ho inviato il codice, ha funzionato come previsto al primo tentativo. Oltre ai guasti hardware e alla migrazione degli ambienti di produzione, abbiamo il 100% di disponibilità in 10 anni. Il rischio che lo sviluppatore porti con sé il codice sorgente non è rilevante. Questo particolare sistema mi ha richiesto 3 mesi per sviluppare, gran parte di questo tempo è stato per capire i limiti delle prestazioni dei componenti. Questa ora è conoscenza dentro la mia testa. Anche senza il codice sorgente posso sviluppare nuovamente questa soluzione in circa una settimana.
- I registri efficaci sono importanti per conoscere tutti coloro che hanno fatto qualcosa. La cosa migliore qui è che i log siano generati da un framework, registrando per schermate dettagliate di breve durata, per tempi di accesso e attività più lunghi e ancora più lunghi i log aziendali. I miei sistemi critici registrano ogni volta che si accede a una schermata (incluso il design dello schermo). Alcune delle risorse critiche dovrebbero essere registrate da un trigger sul database stesso e le tabelle o le risorse critiche dovrebbero essere contrassegnate per il controllo del codice sorgente.
- Lo screening del log è difficile da eseguire manualmente. Scopri come creare filtri sui log per vedere le cose critiche. Un filtro molto utile è incrociare i rapporti sui reclami con l'accesso e le attività degli utenti. Se hai registri abbastanza buoni vedrai delle coincidenze. Ad esempio: prima di un problema l'utente1 effettua sempre l'accesso.
Informazioni sul mancato accesso alla produzione
Le regole che richiedono agli sviluppatori di non accedere ai sistemi di produzione poiché gli utenti sono lì per evitare che gli sviluppatori sottoporre il codice per mostrare al proprio utente le informazioni privilegiate. Penso che questa sia una misura di sicurezza molto, molto debole e facile da rilevare nell'audit del codice sorgente. Esistono diversi modi per aggirare il problema:
- uno sviluppatore più un dipendente poco retribuito;
- si invia un'e-mail;
- apre back-door nel sistema.
L'audit del codice sorgente alla ricerca di backdoor, escalation di accesso e malware sembra più produttivo. Permette di identificare i cattivi sviluppatori quando stanno testando i loro exploit e di licenziarli. Ovviamente uno sviluppatore esperto può nascondere un exploit in bella vista, quindi è importante usare linguaggi e nomi di variabili chiari e chiari. Ricorrere a soluzioni strane solo nei punti documentati delle applicazioni che richiedono prestazioni speciali o offuscamento. Ad esempio, 1 << 4 è uguale a 1 * 16. Ciò avrebbe senso solo se il linguaggio non esegue questa ottimizzazione da solo e il punto in cui si verifica è un collo di bottiglia delle prestazioni. Linguaggi troppo simbolici fanno male proprio per questa stessa ragione. Il codice sorgente dovrebbe essere leggibile da qualsiasi smanettone.
Il problema è peggiore di quanto pensi
I danni più semplici e peggiori che uno sviluppatore può causare non sono legati all'installazione dello strumento. Anche se l'ambiente di sviluppo è gestito, farà poca differenza se l'azienda non dispone di firewall potenti, repository di codice sorgente, build basati esclusivamente sui repository di codice sorgente e revisione del codice.