1c overflow dello stack della lingua integrato. Overflow dello stack

  • 10.01.2022

14/04/2016 Versione 3.22 L'interfaccia è stata modificata, gli errori durante il trasferimento dei registri sono stati corretti, la procedura per il trasferimento di un'organizzazione e dei principi contabili è stata modificata. Piattaforma 8.3.7.2027 BP 3.0.43.174
17/03/2016 Versione 3.24 Gli errori rilevati sono stati corretti. Piattaforma 8.3.8.1747 BP 3.0.43.241
16/06/2016 Versione 3.26 Gli errori riscontrati sono stati corretti. Piattaforma 8.3.8.2088 BP 3.0.44.123
16/10/2016 Versione 4.0.1.2 Corretto il trasferimento del valore di deposito, modificato il trasferimento del principio contabile per i rilasci 3.44.*. Piattaforma 8.3.9.1818 BP 3.0.44.164.
19/04/2017 Versione 4.0.2.7 L'algoritmo per il trasferimento dei registri associati alle directory è stato modificato, gli errori rilevati sono stati corretti, il trasferimento con sovrascrittura dei collegamenti è stato corretto.
29/05/2017 Versione 4.0.4.5 Modificato il trasferimento dei movimenti, aggiunta la visualizzazione dei movimenti dei documenti trasferiti, qualcos'altro...
30/05/2017 Versione 4.0.4.6 Risolto un errore durante la compilazione dell'elenco delle directory esistenti nel sorgente (grazie shoy)
17/06/2017 Versione 4.0.5.1 L'algoritmo per il trasferimento dei movimenti è stato modificato.
19/07/2017 Versione 4.0.5.4 Il trasferimento di CI da BP 2.0 è stato modificato. Inaspettatamente, il trasferimento da UT 10.3 è stato effettuato da Smilegm, in questa versione il trasferimento è stato leggermente corretto per questa situazione)))
08/10/2017 Versione 4.0.5.5 Risolti errori durante il trasferimento da BP 2.0
19.09.2017 Versione 4.4.5.7 Risolto il problema con il controllo della connessione per 3.0.52.*
28/11/2017 Versione 4.4.5.9 Risolti gli errori segnalati
12/06/2017 Versione 5.2.0.4 L'algoritmo di ricerca dei link è stato riprogettato. Sono state aggiunte le procedure di trasferimento dalla BP 1.6; non c'è più un legame stretto con la BP: puoi usarla facilmente per trasferire dati di configurazioni "quasi" identiche. Cercherò di correggere tempestivamente tutti i commenti.
08/12/2017 Versione 5.2.1.3 Aggiunto un algoritmo per il trasferimento delle buste paga da BP.2.0 a BP 3.0. Modifiche incluse per la condivisione tra configurazioni identiche.
19.12.2017 Versione 5.2.2.2 È stato adeguato il trasferimento di registri di informazioni indipendenti per le directory che rientrano nelle dimensioni di questi registri.

12/06/2017 Nuova versione elaborativa 5.2.0.4. Tra i cambiamenti significativi c'è la possibilità di passare da BP 1.6 a BP 3.0. La novità principale è la gestione della ricerca dei collegamenti nelle directory - nelle versioni precedenti la ricerca avveniva per GUID, ma in questa versione è possibile abilitare la ricerca "Per dettagli":

17/01/2018 Versione 5.2.2.3 Risolto - rilevati errori nelle directory subordinate e nei registri delle informazioni periodiche.

19/07/2018 Versione 5.2.2.8 Gli errori rilevati sono stati corretti.

in cui è possibile impostare i dettagli di ricerca per qualsiasi directory. Questo stesso regime “è emerso” su numerose richieste dei lavoratori, nei casi in cui è necessario uno scambio in un database già esistente che contiene già dati (ad esempio, per unire i registri contabili di due organizzazioni in un unico database).

21/12/2015 Sono state rilasciate rispettivamente la piattaforma 8.3.7.1805 e BP 3.0.43.29 una nuova versione elaborazione 3.1:-) (descrizione sotto). Nuova funzionalità: la possibilità di confrontare saldi e fatturati tra due database BP (per tutti i conti, se i piani contabili coincidono, o per singoli conti contabili corrispondenti, con o senza analisi).
03/01/2016 Versione 3.5 - è stato modificato il meccanismo di connessione alla base sorgente - reso conforme a BSP 2.3.2.43. Bug minori risolti. Piattaforma 8.3.7.1845, BP 3.0.43.50
16/02/2016 Versione 3.6 - Aggiunto il flag “Imposta correzione manuale” per i documenti trasferiti con movimenti. Trasferimento fisso di movimenti: i documenti con data inferiore all'inizio del periodo vengono trasferiti senza movimenti. Piattaforma 8.3.7.1917, BP 3.0.43.116
22/03/2016 Versione 3.10 - Aggiunto il flag "Sovrascrivi sempre i riferimenti" per la riscrittura obbligatoria degli oggetti referenziati (la velocità di trasferimento è notevolmente ridotta, ma a volte è necessaria). È stata aggiunta la scheda "Preparazione" dove è possibile configurare la corrispondenza dei piani dei conti di origine e di destinazione (allo stesso livello dei codici conto) e il trasferimento delle costanti. Piattaforma 8.3.7.1970, BP 3.0.43.148

03/04/2016 Versione 3.11 Modificata la compilazione dell'elenco dei documenti esistenti in fonte: veniva compilata per movimenti secondo il piano dei conti, veniva fatta semplicemente per link di periodo, proprio come in // sito/pubblico/509628/

L'elaborazione è intesa al trasferimento dei dati per qualsiasi periodo allo stesso modo del "Caricamento MXL" con ITS, solo senza utilizzare XML, JSON e altri file intermedi - scambio da database a database tramite COM. Nelle versioni precedenti alla 3.10, la connessione viene utilizzata utilizzando un algoritmo del BSP, che prevede la registrazione di comcntr.dll (se il sistema operativo “lo consente”), nonché vari messaggi quando è impossibile stabilire una connessione, ad es. esempio: "La base di informazioni è in fase di aggiornamento", ecc. Aggiunto controllo per la selezione di un ricevitore come sorgente IS: viene emesso un avviso.

Può essere utilizzato per:

1. Trasferimento delle informazioni di riferimento normativo (RNI) dalla fonte IS alla destinazione IS (il trasferimento di tutte le informazioni di riferimento viene effettuato su richiesta dell'utente, i libri di consultazione necessari, ecc. vengono trasferiti tramite collegamenti durante qualsiasi trasferimento).

2. Trasferimento di documenti per qualsiasi periodo selezionato.

3. Trasferimento di tutte le informazioni da un sistema di sicurezza delle informazioni "rotto" se viene avviato in modalità 1C:Enterprise e il caricamento dei dati o l'avvio del Configuratore è impossibile.

Caratteristiche del trattamento - la sicurezza delle informazioni del destinatario e della fonte può essere diversa; trasferimento da 2.0 a 3.0 - le edizioni sono diverse, ma il trasferimento funziona!!! I dettagli non corrispondenti vengono ignorati oppure è necessario specificarne gli algoritmi di trasferimento.

Commento: La conversione dei dati NON È UTILIZZATA! E non chiederti perché!!! Per coloro che sono particolarmente esigenti - BP 3.0 cambia quasi ogni giorno, non c'è più la forza di mantenere aggiornate le regole di trasferimento - qui tutto è più semplice :-).

Un'altra caratteristica dell'elaborazione è che viene avviata nella sicurezza delle informazioni del destinatario (gli analoghi più vicini in termini di funzionalità funzionano al contrario, dalla fonte al destinatario).

Per iniziare: è necessario specificare il periodo di elaborazione, specificare l'organizzazione dalla fonte, verrà trasferita alla destinazione.

Quando si trasferisce un'organizzazione, vengono trasferiti i principi contabili e i registri delle informazioni “correlate”. Pertanto, quando selezioni per la prima volta un'organizzazione nell'origine, passerà del tempo prima che appaia nel ricevitore.

I piani contabili dell'origine e della destinazione devono essere gli stessi, non vengono trasferiti conti diversi nella versione 2.* alla destinazione, è previsto l'adeguamento dei conti e delle analisi corrispondenti in futuro. Gli account vengono trasferiti utilizzando codici che non si trovano nel ricevitore NON POSSONO ESSERE CREATI!!!

Gli oggetti rimanenti vengono trasferiti utilizzando identificatori interni (GUID), quindi dovresti prestare attenzione ad alcune directory chiave, ad esempio - Valute.

Se prevedi di effettuare lo scambio con un database “pulito”, è meglio eliminare le directory compilate al primo avvio prima dello scambio. Perché c'è una pagina nell'elaborazione in cui puoi ottenere questi elementi della directory ed eliminarli. Come minimo, è necessario rimuovere la valuta "sfregamento". - Perché la duplicazione è quasi inevitabile (in linea di principio, questo può essere facilmente corretto dopo aver condiviso la ricerca e la sostituzione dei duplicati incorporata in BP 3.0).

L'elaborazione prevede la chiamata alla pagina di cancellazione directory all'apertura del form di compilazione iniziale:

All'apertura dell'elaborazione verrà visualizzata la pagina per la cancellazione delle directory compilate in fase di compilazione iniziale:

Dalla versione 3.22 l'interfaccia è stata modificata, ora tutte le operazioni preparatorie sono a schede e sempre disponibili


È importante verificare la corrispondenza del piano dei conti della fonte e del destinatario e assicurarsi di indicare la corrispondenza dei conti.

Non è necessario eliminare gli elementi della directory predefiniti: vengono trasferiti tramite identificatori di configurazione (non GUID).

È possibile selezionare gli oggetti da trasferire utilizzando il modulo di selezione da directory e documenti (i registri delle informazioni associati a questi oggetti verranno trasferiti automaticamente, quindi non è necessario selezionarli separatamente).Trasferimento di registri, la riduzione è temporaneamente disabilitata - è necessario sviluppare un elenco di registri per il trasferimento - qualcosa dovrebbe essere trasferito, qualcosa no, in questa fase è sufficiente ciò che viene trasferito nelle directory, l'elenco dei registri per il trasferimento sarà nel modello nelle versioni future.

Quando si scambia con 2.0, alcuni dettagli (ad esempio, Informazioni sui contatti) viene trasferito secondo l'algoritmo integrato nell'elaborazione, perché per 2.0 e 3.0 vengono memorizzati in modo diverso. La situazione è simile per una serie di documenti (ad esempio, l'adeguamento del debito).

L'elenco dei tipi di oggetto può essere compilato diversamente nella versione 3.22, questo è inserito in un sottomenu, le modifiche sono indicate nell'immagine:

C'è una semplificazione nell'uso dell'elaborazione: non è possibile selezionare le directory per lo scambio, ma semplicemente riempire l'elenco dei tipi nel ricevitore solo con quei tipi di directory che hanno almeno una voce nell'origine.

L'elaborazione ha un layout integrato che elenca le directory che non devono essere trasferite dall'origine alla destinazione (il layout "Escludi dal trasferimento"). È possibile aggiungere (rimuovere) qualsiasi directory a questo layout. Se non è necessario trasferire tutti i dati di riferimento è sufficiente trasferire i documenti, il cui elenco è ottenibile anche senza selezionare le tipologie, è sufficiente compilare tutti i documenti sorgente per i quali esistono transazioni.

È previsto il trasferimento di documenti con movimenti; per gli scambi da 3.0 a 3.0 e la corrispondenza dei piani dei conti funziona uno a uno; nello scambio da 2.0 a 3.0 sono possibili errori, quindi si consiglia di trasferire documenti senza movimenti, e poi trasferirli semplicemente al ricevitore. Nel caso di trasferimento di documenti con movimenti è impostato il flag “Rettifica manuale”.

L'attributo "Inserito" è impostato nei documenti destinatari allo stesso modo dell'origine, ma i movimenti (se non sono stati trasferiti) appariranno solo dopo che i documenti sono stati elaborati, ad esempio, utilizzando l'elaborazione incorporata nella registrazione di gruppo BP 3.0 documenti (opzione consigliata) o da questa elaborazione (qui è presente il pulsante "Pubblica documenti").

Se è previsto che il trattamento venga utilizzato per uno scambio permanente, può essere registrato nella sicurezza delle informazioni del destinatario (il pulsante “Registrati”). Per i trasferimenti "una tantum", puoi semplicemente utilizzarlo tramite File - Apri.

21/12/2015 - Versione 3.1 piattaforma 8.3.7.1805 e alimentatore 3.0.43.29 (la versione 2.15 per 3.0.43.* non funziona - la configurazione è stata modificata parecchio).

Cambiato:

Finestra di dialogo per la selezione di un'opzione di connessione, il flag Client-server è sempre disponibile, a seconda della sua impostazione, sia la scelta di una cartella di file database, oppure un campo con il nome del database sul server e il nome del server stesso disponibile (è stato corretto un bug nella finestra di dialogo della versione 2.15)

- NUOVA FUNZIONALITÀ: Un meccanismo per riconciliare i saldi e il fatturato tra i database di origine e quelli di destinazione con vari gradi di dettaglio:


Penso che la scelta delle opzioni di verifica sia chiara dalla figura:


Ci sono differenze nell'uso nel thin client e nel Thick Client: nel Thick Client viene immediatamente visualizzata una finestra di confronto dei file:


Nel thin client non mi sono preoccupato della pressione programmatica dei pulsanti; suggerisco una semplice opzione per visualizzare una finestra di confronto:


Il confronto in un thin client, IMHO, è più conveniente, perché... ha pulsanti di navigazione per le differenze, che è più conveniente per le tabelle di grandi dimensioni rispetto allo scorrimento con il mouse:

22/03/2016 Versione 3.10 - Aggiunto il flag "Sovrascrivi sempre i riferimenti" per la riscrittura obbligatoria degli oggetti referenziati (la velocità di trasferimento è notevolmente ridotta, ma a volte è necessaria). È stata aggiunta la scheda "Preparazione" dove è possibile configurare la corrispondenza dei piani dei conti di origine e di destinazione (allo stesso livello dei codici conto) e il trasferimento delle costanti. Piattaforma 8.3.7.1970, BP 3.0.43.148

- NUOVA FUNZIONALITÀ: Prima di trasferire i documenti, si consiglia di verificare la coerenza del piano dei conti nell'origine e nella destinazione, nonché il rispetto delle costanti stabilite.

A questo scopo è stata aggiunta una scheda “Preparazione” nella quale è possibile impostare queste corrispondenze:


L'algoritmo per compilare la tabella di corrispondenza dei conti è semplice: viene analizzato il fatturato esistente nella fonte e per ogni conto trovato lì, viene trovata una corrispondenza nel destinatario tramite codice; se non viene trovata una corrispondenza, una riga con il conto il codice viene visualizzato nella tabella, in base alla quale è necessario selezionare il conto del destinatario, verrà utilizzato durante il trasferimento. La conformità Poke è stabilita a livello di codice.

Per verificare e trasferire la corrispondenza delle costanti stabilite si utilizza la tabella corrispondente:

Lo compiliamo e lo trasferiamo se necessario. Vengono trasferite solo le costanti contrassegnate con il flag...

Lo stack di programmi è un'area di memoria speciale organizzata secondo il principio della coda LIFO (Last in, first out). Il nome "stack" deriva dall'analogia del principio della sua costruzione con una pila di piatti: puoi mettere i piatti uno sopra l'altro (il metodo per aggiungere alla pila, "push", "push"), e poi toglieteli, partendo dall'alto (metodo per ottenere un valore dallo stack, "popping", "pop"). Lo stack del programma è anche chiamato stack delle chiamate, stack dell'esecuzione o stack della macchina (per non confonderlo con lo "stack" - una struttura dati astratta).

A cosa serve una pila? Permette di organizzare comodamente la chiamata delle subroutine. Quando viene chiamata, la funzione riceve alcuni argomenti; deve anche memorizzare le sue variabili locali da qualche parte. Inoltre, dobbiamo tenere conto del fatto che una funzione può richiamare un'altra funzione, che deve anch'essa passare parametri e memorizzare le sue variabili. Utilizzando lo stack, quando si passano i parametri è sufficiente metterli nello stack, quindi la funzione chiamata può “estrarli” da lì e utilizzarli. Qui è anche possibile memorizzare variabili locali: all'inizio del suo codice, la funzione alloca parte della memoria dello stack e quando il controllo ritorna, la cancella e la libera. I programmatori di linguaggi di alto livello di solito non pensano a queste cose: il compilatore genera per loro tutto il codice di routine necessario.

Conseguenze di un errore

Adesso siamo quasi vicini al problema. In astratto, una pila è un magazzino infinito in cui è possibile aggiungere all'infinito nuovi elementi. Sfortunatamente, nel nostro mondo tutto è finito e la memoria dello stack non fa eccezione. Cosa succede se termina quando gli argomenti della funzione vengono inseriti nello stack? Oppure la funzione alloca memoria per le sue variabili?

Si verificherà un errore chiamato overflow dello stack. Poiché lo stack è necessario per organizzare la chiamata di funzioni definite dall'utente (e quasi tutti i programmi nei linguaggi moderni, compresi quelli orientati agli oggetti, sono costruiti sulla base di funzioni in un modo o nell'altro), non saranno più in grado di farlo. essere chiamato. Pertanto, il sistema operativo prende il controllo, cancella lo stack e termina il programma. Qui possiamo sottolineare la differenza tra stack overflow e stack overflow - nel primo caso, si verifica un errore quando si accede a un'area di memoria errata e, se in questa fase non è presente alcuna protezione, non si manifesta in quel momento - con successo combinazione di circostanze, il programma può funzionare normalmente. Se solo la memoria a cui si accede fosse protetta, . Nel caso di uno stack il programma termina sicuramente.

Per essere completamente precisi, va notato che tale descrizione degli eventi è vera solo per i compilatori che compilano in codice nativo. Nei linguaggi gestiti, la macchina virtuale ha il proprio stack per i programmi gestiti, il cui stato è molto più semplice da monitorare e ci si può anche permettere di lanciare un'eccezione al programma quando si verifica un overflow. Nei linguaggi C e C++ non si può contare su un simile “lusso”.

Ragioni dell'errore

Cosa potrebbe portare a una situazione così spiacevole? In base al meccanismo sopra descritto, una possibilità è che ci siano troppe chiamate di funzioni annidate. Questo scenario è particolarmente probabile quando si utilizza la ricorsione. La ricorsione infinita (in assenza di un meccanismo di valutazione pigro) viene interrotta in questo modo, al contrario di , che a volte ha applicazioni utili. Tuttavia, con una piccola quantità di memoria assegnata allo stack (cosa tipica, ad esempio, dei microcontrollori), può essere sufficiente una semplice sequenza di chiamate.

Un'altra opzione sono le variabili locali, che richiedono molta memoria. Avere un array locale di un milione di elementi o un milione di variabili locali (non si sa mai cosa succede) non è l'idea migliore. Anche una sola chiamata a una funzione così avida può facilmente causare un overflow dello stack. Per ottenere grandi quantità di dati è meglio utilizzare meccanismi di memoria dinamica, che permetteranno di gestire l'errore della sua mancanza.

Tuttavia, la memoria dinamica è piuttosto lenta in termini di allocazione e deallocazione (poiché è il sistema operativo a gestirla) e con l'accesso diretto è necessario allocarla e deallocarla manualmente. La memoria sullo stack viene allocata molto rapidamente (infatti, è sufficiente modificare il valore di un registro); inoltre, gli oggetti allocati sullo stack hanno distruttori chiamati automaticamente quando ritorna il controllo della funzione e lo stack viene cancellato. Naturalmente, sorge immediatamente il desiderio di ottenere memoria dallo stack. Pertanto, il terzo modo di overflow è l'allocazione di memoria da parte del programmatore nello stack. La libreria C mette a disposizione specificatamente a questo scopo la funzione alloca. È interessante notare che se la funzione per allocare memoria dinamica malloc ha il suo "gemello" per liberarla, free, allora la funzione alloca non ce l'ha: la memoria viene liberata automaticamente dopo il ritorno del controllo della funzione. Forse questo complica solo la situazione: non sarà possibile liberare la memoria prima di uscire dalla funzione. Anche se, secondo la pagina man, "la funzione alloca dipende dalla macchina e dal compilatore; su molti sistemi la sua implementazione è problematica e piena di bug; il suo utilizzo è molto frivolo e disapprovato" - viene ancora utilizzata.

Esempi

Ad esempio, diamo un'occhiata al codice per la ricerca ricorsiva di file che si trova su MSDN:

Void DirSearch(String* sDir) ( try ( // Trova le sottocartelle nella cartella passata. String* d = Directory::GetDirectories(sDir); int numDirs = d->get_Length(); for (int i= 0;i< numDirs; i++) { // Find all the files in the subfolder. String* f = Directory::GetFiles(d[i],textBox1->Testo); int numFiles = f->get_Length(); for (int j=0; j< numFiles; j++) { listBox1->Elementi->Aggiungi(f[j]); ) DirSearch(d[i]); ) ) catch (Sistema::Eccezione* e) ( MessageBox::Mostra(e->Messaggio); ) )

Questa funzione ottiene un elenco di file nella directory specificata e quindi richiama se stessa per quegli elementi dell'elenco che risultano essere directory. Di conseguenza, con un albero sufficientemente profondo file system, otteniamo un risultato naturale.

Un esempio del secondo approccio, tratto dalla domanda "Perché si verifica l'overflow dello stack?" da un sito chiamato Stack Overflow (il sito è una raccolta di domande e risposte su qualsiasi argomento di programmazione, e non solo Stack Overflow, come potrebbe sembrare):

#define W 1000 #define H 1000 #define MAX 100000 //... int main() ( int image; float dtr; initImg(image,dtr); return 0; )

Come puoi vedere, la funzione main alloca memoria nello stack per array di tipo int e float, ciascuno con un milione di elementi, che in totale danno poco meno di 8 megabyte. Se si considera che per impostazione predefinita Visual C++ riserva solo 1 megabyte per lo stack, la risposta diventa ovvia.

Ed ecco un esempio tratto dal repository GitHub del progetto Lightspark Flash player:

DefineSoundTag::DefineSoundTag(/* ... */) ( // ... unsigned int soundDataLength = h.getLength()-7; unsigned char *tmp = (unsigned char *)alloca(soundDataLength); // .. . )

Puoi sperare che h.getLength()-7 non sia un numero troppo grande in modo che non ci sia overflow nella riga successiva. Ma il tempo risparmiato sull’allocazione della memoria vale il “potenziale” crash del programma?

Linea di fondo

L'overflow dello stack è un errore fatale che molto spesso colpisce i programmi contenenti funzioni ricorsive. Tuttavia, anche se il programma non contiene tali funzioni, è comunque possibile un overflow a causa della grande dimensione delle variabili locali o di un errore nell'allocazione manuale della memoria nello stack. Rimangono in vigore tutte le regole classiche: se c'è una scelta, è meglio scegliere l'iterazione invece della ricorsione, e inoltre non fare lavoro manuale al posto del compilatore.

Bibliografia

  • E. Tanenbaum. Architettura del computer.
  • Wikipedia. Overflow dello stack.
  • Overflow dello stack. Overflow dello stack C++.

Lo stack, in questo contesto, è l'ultimo nel primo buffer che allochi durante l'esecuzione del tuo programma. Last, First (LIFO) significa che l'ultima cosa che inserisci è sempre la prima cosa che rimetti a posto: se inserisci 2 elementi nello stack, "A" e poi "B", allora la prima cosa che togli dallo stack sarà "B" e la prossima cosa sarà "A".

Quando chiami una funzione nel codice, il comando successivo alla chiamata alla funzione viene archiviato nello stack e nell'eventuale spazio di memoria che può essere sovrascritto dalla chiamata alla funzione. La funzione scelta può utilizzare più stack per le proprie variabili locali. Al termine, libererà lo spazio delle variabili locali che stava utilizzando e quindi ritornerà alla funzione precedente.

Overflow dello stack

Un overflow dello stack si verifica quando hai utilizzato più memoria nello stack di quella che il tuo programma intendeva utilizzare. Sui sistemi embedded, potresti avere solo 256 byte per lo stack e se ciascuna funzione occupa 32 byte, puoi avere solo 8 chiamate di funzione alla funzione 2 con la funzione profonda 1, che chiama la funzione 3, che chiama la funzione 4. ..chi chiama la funzione 8, che chiama la funzione 9, ma la funzione 9 sovrascrive la memoria all'esterno dello stack. Ciò potrebbe sovrascrivere memoria, codice, ecc.

Molti programmatori commettono questo errore chiamando la funzione A, che poi chiama la funzione B, che poi chiama la funzione C, che poi chiama la funzione A. Potrebbe funzionare per la maggior parte del tempo, ma solo un input sbagliato la farà girare per sempre finché il computer fallisce scopre che lo stack è pieno.

Anche le funzioni ricorsive sono una causa di questo, ma se stai scrivendo in modo ricorsivo (cioè la tua funzione chiama se stessa) allora devi esserne consapevole e usare variabili statiche/globali per prevenire una ricorsione infinita.

In genere, il sistema operativo e il linguaggio di programmazione che stai utilizzando gestiscono lo stack ed è fuori dal tuo controllo. Dovresti guardare il grafico delle chiamate (una struttura ad albero che mostra dal punto principale cosa chiama ciascuna funzione) per vedere quanto sono profonde le chiamate alla funzione e identificare i loop e la ricorsione che non sono previsti. I cicli intenzionali e la ricorsione devono essere controllati artificialmente dagli errori se si chiamano a vicenda troppe volte.

A parte le buone pratiche di programmazione e i test statici e dinamici, non c'è molto che puoi fare in questi sistemi di alto livello.

Sistemi integrati

Nel mondo embedded, in particolare nel codice ad alta garanzia (automobilistico, aerospaziale, aerospaziale), si eseguono test approfonditi e revisione del codice, ma si eseguono anche le seguenti operazioni:

  • Disabilita ricorsione e cicli: policy e verifica della conformità
  • Mantieni il codice e lo stack distanti (codice in flash, stack nella RAM e non corrisponderanno mai tra loro)
  • Posiziona le barre di guardia attorno allo stack: un'area vuota di memoria che riempi con un numero magico (di solito la routine di interruzione, ma qui ci sono molte varianti) e centinaia o migliaia di volte al secondo guardi le barre di guardia per creare certo che non sono stati sovrascritti.
  • Utilizza la protezione della memoria (ovvero non eseguire sullo stack, non leggere o scrivere direttamente dietro lo stack)
  • Gli interrupt non chiamano funzioni secondarie: impostano flag, copiano dati e lasciano che l'applicazione si occupi di gestirli (altrimenti potresti finire 8 in profondità nell'albero delle chiamate di funzione, avere un interrupt e quindi avere qualche altra funzione all'interno l'uscita di interruzione, provocando un lancio). Hai più alberi delle chiamate: uno per i processi principali e uno per ciascun interrupt. Se le vostre interruzioni possono interrompersi a vicenda... beh, ci sono i draghi...

Linguaggi e sistemi di alto livello

Ma nei linguaggi di alto livello in esecuzione su sistemi operativi:

  • Riduci l'archiviazione delle variabili locali (le variabili locali sono archiviate nello stack), anche se i compilatori sono abbastanza intelligenti a riguardo e talvolta inseriscono grossi pezzi nell'heap se l'albero delle chiamate è poco profondo)
  • Evitare o limitare rigorosamente la ricorsione
  • Non interrompere troppo i tuoi programmi in funzioni sempre più piccole: anche senza considerare le variabili locali, ogni chiamata di funzione consuma fino a 64 byte nello stack (processore a 32 bit, risparmiando metà dei registri del processore, flag, ecc.).
  • Mantieni l'albero delle chiamate poco profondo (simile alla descrizione sopra)

Server Web

Dipende dalla sandbox che hai se puoi controllare o addirittura vedere lo stack. È probabile che tu possa gestire i server web come qualsiasi altro linguaggio e sistema operativo di alto livello: è in gran parte fuori dal tuo controllo, ma controlla la lingua e lo stack di server che stai utilizzando. Ad esempio, puoi dividere lo stack sul tuo server SQL.

La Guida del programmatore API Informix® DataBlade™ è disponibile per il download. La sezione "Gestione dello spazio dello stack" descrive la creazione di funzioni definite dall'utente (UDR). In questo articolo vengono fornite informazioni aggiuntive e suggerimenti per il debug.

Le seguenti informazioni si applicano se UDR è in esecuzione su un processore virtuale (VP) definito dall'utente o su una CPU VP. Lo stack di un thread può essere spostato su un processore virtuale definito dall'utente immediatamente prima di eseguire l'UDR.

Quale stack di dimensioni viene allocato per UDR?

La dimensione dello stack disponibile per un UDR dipende da come è stato creato l'UDR:

    utilizzando il modificatore STACK, che consente all'UDR di utilizzare il suo stack appositamente allocato,

    senza il modificatore STACK, il che significa che UDR condividerà lo stack allocato dal server con il thread che effettua la richiesta. La dimensione dello stack in questo caso sarà determinata dal valore del parametro STACKSIZE nel file di configurazione onconfig.

Modificatore STACK

Le istruzioni CREATE PROCEDURE o CREATE FUNCTION dispongono di un modificatore STACK opzionale che consente di specificare la quantità di spazio nello stack, in byte, necessaria per eseguire l'UDR.

Se si utilizza il modificatore STACK durante la creazione di un UDR, il server allocherà e deallocherà lo spazio dello stack ogni volta che viene eseguito l'UDR. La dimensione effettiva disponibile è uguale al valore STACK in byte meno un po' di sovraccarico a seconda del numero di argomenti della funzione.

Se il valore STACK è inferiore al parametro STACKSIZE nel file onconfig (vedere la sezione successiva), la dimensione dello stack allocata per l'UDR verrà automaticamente arrotondata al valore STACKSIZE.

Parametro di configurazione STACKSIZE

Il file di configurazione onconfig include un parametro STACKSIZE che specifica la dimensione dello stack predefinita per i thread utente.

Se non si specifica STACK durante la creazione di un UDR, il server non alloca spazio stack aggiuntivo per eseguire tale UDR. Invece, l'UDR utilizza lo spazio dello stack allocato per eseguire la richiesta. La dimensione dello stack disponibile dipenderà dal sovraccarico dell'esecuzione della funzione a livello SQL.

Lo stack per thread viene allocato una volta per il thread specifico che esegue la richiesta. Le prestazioni sono migliori quando l'UDR condivide uno stack con un thread, poiché il server non spreca risorse allocando uno stack aggiuntivo per ogni chiamata UDR. D'altro canto, se la dimensione dello stack utilizzata dall'UDR si avvicina al valore STACKSIZE, potrebbe causare un overflow dello stack quando si chiama la funzione come parte di una query complessa (nel qual caso sarà disponibile meno spazio nello stack per l'esecuzione dell'UDR).

Tieni presente che non dovresti impostare il valore STACKSIZE troppo alto, poiché ciò influenzerà tutti i thread dell'utente.

Quando è necessario controllare la dimensione dello stack?

YÈ necessario gestire lo spazio dello stack se l'UDR effettua chiamate ricorsive o se l'UDR richiede più spazio dello stack di quello disponibile per impostazione predefinita nello stack del thread di richiesta (STACKSIZE).

Esistono due modi per aumentare lo stack per l'esecuzione dell'UDR:

    Specificare il modificatore STACK durante la creazione di un UDR.

    Utilizzare mi_call() per effettuare chiamate ricorsive (vedere la Guida del programmatore API Informix DataBlade per un esempio).

Se non specifichi una dimensione tramite STACK e se non usi mi_call() per aumentare lo stack corrente e se l'UDR fa qualcosa che richiede molto spazio nello stack, causerà un overflow dello stack.

Tieni presente che alcune funzioni mi_* aggiungono un nuovo segmento di stack per la propria esecuzione. Questi segmenti vengono liberati quando si ritorna alla funzione UDR chiamante.

Cosa fare se qualcosa va storto?

Monitoraggio dell'utilizzo dello stack

Lo scopo del monitoraggio è identificare l'UDR specifico che causa l'overflow dello stack in modo da poter modificare il valore STACK specificamente per quel particolare UDR.

    Monitoraggio dell'utilizzo dello stack con il comando "onstat -g sts".

    Monitoraggio di una sessione eseguendo una query SQL utilizzando "onstat -g ses session_id"

Dopo aver identificato una query SQL che termina con un overflow dello stack, è necessario determinare l'utilizzo dello stack eseguendo separatamente le query UDR che fanno parte della query originale.

È possibile impostare dinamicamente il valore STACK per UDR. Per esempio:

altera la funzione MyFoo (lvarchar,lvarchar) con (aggiungi stack=131072);

Dopo aver modificato il valore STACK, dovresti testare la richiesta originale per assicurarti che ora sia stabile.

Aumenta STACKSIZE

In alternativa, prova ad aumentare il valore STACKSIZE. Controlla se questo risolve il problema. (Non dimenticare di restituire il vecchio valore in seguito).

Se l'aumento di STACKSIZE non risolve il problema, molto probabilmente il problema è un danneggiamento della memoria. Ecco alcuni suggerimenti:

    Abilita lo scarabocchio della memoria e il controllo del pool di memoria. La sezione "Problemi di debug" nell'articolo Allocazione memoria per UDR spiega come eseguire questa operazione.

    Riconsiderare l'utilizzo di mi_lvarchar . Particolare attenzione dovrebbe essere prestata ai punti in cui mi_lvarchar viene passato a una funzione che prevede di ricevere una stringa con terminazione null come argomento.

    Ridurre il numero di VP della CPU (o dell'utente) a uno per riprodurre il problema più velocemente.

mi_print_stack() -- Solaris

Informix Dynamic Server per il sistema operativo Solaris include una funzione mi_print_stack() che può essere richiamata nell'UDR. Per impostazione predefinita, questa funzione salva lo stack frame nel seguente file:

/tmp/default.stack

Non è possibile modificare il nome del file di output, ma è possibile modificarne la posizione modificando il valore della variabile di ambiente DBTEMP. Assicurarsi che la directory $DBTEMP sia scrivibile dall'utente informix. Eventuali errori riscontrati durante l'esecuzione di mi_print_stack() vengono segnalati a $MSGPATH.

Questa funzionalità è disponibile solo per OC Solaris.

Glossario

Termini e abbreviazioni utilizzati in questo articolo:

UDRRoutine definita dall'utente
V.P.Processore virtuale

Questo articolo dimostra ancora una volta che qualsiasi insieme di misure di sicurezza deve coprire tutte le fasi di implementazione: sviluppo, distribuzione, amministrazione del sistema e, ovviamente, misure organizzative. Nei sistemi informativi è il “fattore umano” (compresi gli utenti) la principale minaccia alla sicurezza. Questo insieme di misure deve essere ragionevole ed equilibrato: non ha senso ed è improbabile che vengano stanziati fondi sufficienti per organizzare una protezione che superi il costo dei dati stessi.

introduzione

1C:Enterprise è il sistema contabile più diffuso in Russia, ma nonostante ciò, fino alla versione 8.0 i suoi sviluppatori prestavano pochissima attenzione ai problemi di sicurezza. Fondamentalmente, ovviamente, ciò è stato dettato dalla nicchia di prezzo del prodotto e dall’attenzione rivolta alle piccole imprese dove non esistono specialisti IT qualificati e il possibile costo di implementazione e mantenimento di un sistema sicuro sarebbe proibitivo per l’azienda. Con il rilascio della versione 8.0, l'enfasi ha dovuto cambiare: il costo delle soluzioni è aumentato in modo significativo, il sistema è diventato molto più scalabile e flessibile - i requisiti sono cambiati in modo significativo. Se il sistema sia diventato sufficientemente affidabile e sicuro è una questione molto individuale. Il sistema informativo principale di un'impresa moderna deve soddisfare almeno i seguenti requisiti di sicurezza:

  • Probabilità piuttosto bassa di guasto del sistema dovuto a motivi interni.
  • Autorizzazione utente affidabile e protezione dei dati da azioni errate.
  • Un sistema efficace per l'assegnazione dei diritti utente.
  • Sistema di backup e ripristino online in caso di guasto.

Le soluzioni basate su 1C:Enterprise 8.0 soddisfano questi requisiti? Non esiste una risposta chiara. Nonostante i cambiamenti significativi nel sistema di controllo degli accessi, rimangono molte questioni irrisolte. A seconda di come il sistema è progettato e configurato, tutti questi requisiti potrebbero non essere soddisfatti o soddisfatti in misura sufficiente per una determinata implementazione, tuttavia vale la pena prestare attenzione (e questa è una conseguenza significativa della “giovinezza” della piattaforma ) che per soddisfare pienamente le condizioni elencate è necessario applicare sforzi veramente erculei.

Questo articolo è destinato agli sviluppatori e agli implementatori di soluzioni sulla piattaforma 1C:Enterprise, nonché agli amministratori di sistema delle organizzazioni in cui viene utilizzato 1C:Enterprise e descrive alcuni aspetti dello sviluppo e della configurazione della versione client-server del sistema dal punto di vista dell’organizzazione informazioni di sicurezza. Questo articolo non può essere utilizzato in sostituzione della documentazione, ma sottolinea solo alcuni punti che non sono ancora stati riflessi in esso. E, naturalmente, né questo articolo né tutta la documentazione saranno in grado di riflettere la complessità del problema della costruzione di un sistema informativo sicuro, che allo stesso tempo deve soddisfare requisiti contrastanti di sicurezza, prestazioni, comodità e funzionalità.

Classificazione e terminologia

L'argomento chiave di considerazione nell'articolo sono le minacce informatiche.

Minaccia informativa– la possibilità che si verifichi una situazione in cui i dati verranno letti, copiati, modificati o bloccati senza autorizzazione.

E, sulla base di questa definizione, l’articolo classifica le minacce informatiche come segue:

  • Distruzione non autorizzata dei dati
  • Modifica dei dati non autorizzata
  • Copia non autorizzata dei dati
  • Lettura non autorizzata dei dati
  • Indisponibilità dei dati

Tutte le minacce si dividono in intenzionali e non intenzionali. Chiameremo una minaccia informativa realizzata incidente. Le caratteristiche del sistema sono:

Vulnerabilità– caratteristiche che portano a incidenti Misure di protezione– caratteristiche che bloccano la possibilità di un incidente

Fondamentalmente vengono considerati solo quei casi la cui probabilità è dovuta all'utilizzo della piattaforma tecnologica 1C: Enterprise 8.0 nella versione client-server (inoltre, nei casi in cui ciò non contraddice il significato semplicemente di 1C o 1C 8.0) . Definiamo i seguenti ruoli principali in relazione all'utilizzo del sistema:

  • Operatori– utenti che dispongono dei diritti di visualizzazione e modifica dei dati limitati da un ruolo dell'applicazione, ma non dispongono di funzioni amministrative
  • Amministratori di sistema– utenti che dispongono di diritti amministrativi nel sistema, inclusi diritti amministrativi nei sistemi operativi del server delle applicazioni e del server MS SQL, diritti amministrativi in ​​MS SQL, ecc.
  • Amministratori della sicurezza informatica– utenti ai quali sono delegate determinate funzioni amministrative nella base informativa 1C (come aggiunta di utenti, test e correzioni, backup, impostazione di una soluzione applicativa, ecc.)
  • Sviluppatori di sistemi– utenti che sviluppano una soluzione applicativa. In generale, potrebbero non avere accesso al sistema di lavoro.
  • Persone che non hanno accesso diretto al sistema– utenti a cui non sono delegati i diritti di accesso a 1C, ma che possono, in un modo o nell'altro, influenzare il funzionamento del sistema (di solito si tratta di tutti gli utenti dello stesso dominio Active Directory in cui è installato il sistema). Questa categoria viene considerata principalmente per identificare soggetti potenzialmente pericolosi presenti nell'impianto.
  • Script amministrativi automatizzati– programmi a cui sono delegate determinate funzioni, progettati per eseguire automaticamente determinate azioni (ad esempio, import-export di dati)

Qui occorre notare due punti: in primo luogo, questa classificazione è molto approssimativa e non tiene conto delle divisioni all'interno di ciascun gruppo - tale divisione verrà creata per alcuni casi specifici, e in secondo luogo, si presuppone che altre persone non possano influenzare l'operazione del sistema, che dovrà essere erogato con mezzi esterni a 1C.

Qualsiasi sistema di sicurezza deve essere progettato tenendo presente la fattibilità e il costo di proprietà. In generale, quando si sviluppa e si implementa un sistema informativo, è necessario che il prezzo della protezione del sistema corrisponda a:

  • il valore delle informazioni protette;
  • costi per la creazione di un incidente (in caso di minaccia deliberata);
  • rischi finanziari in caso di incidente

È inutile e dannoso organizzare una difesa che è molto più costosa che valutarne l’efficacia finanziaria. Esistono diversi metodi per valutare i rischi di perdita di informazioni, ma non vengono discussi nell'ambito di questo articolo. Un altro aspetto importante è il mantenimento di un equilibrio tra requisiti spesso contrastanti in termini di sicurezza delle informazioni, prestazioni del sistema, comodità e facilità di utilizzo del sistema, velocità di sviluppo e implementazione e altri requisiti per i sistemi informativi aziendali.

Caratteristiche principali del meccanismo di sicurezza delle informazioni del sistema

1C:Enterprise 8.0 è disponibile in due versioni: file e client-server. La versione del file non può essere considerata tale da garantire la sicurezza delle informazioni del sistema per i seguenti motivi:

  • Dati e configurazione vengono memorizzati in un file leggibile e scrivibile da tutti gli utenti del sistema.
  • Come verrà mostrato di seguito, l'autorizzazione del sistema può essere aggirata molto facilmente.
  • L'integrità del sistema è garantita solo dal kernel della parte client.

Nella versione client-server, per archiviare le informazioni viene utilizzato MS SQL Server che fornisce:

  • Archiviazione dei dati più affidabile.
  • Isolamento dei file dall'accesso diretto.
  • Meccanismi di transazione e blocco più avanzati.

Nonostante le differenze significative tra le versioni file e client-server del sistema, dispongono di uno schema di controllo degli accessi unificato a livello di soluzione applicativa, che fornisce le seguenti funzionalità:

  • Autorizzazione dell'utente utilizzando la password specificata in 1C.
  • Autorizzazione utente basata sull'utente Windows corrente.
  • Assegnazione di ruoli agli utenti del sistema.
  • Limitazione delle funzioni amministrative in base al ruolo.
  • Assegnazione delle interfacce disponibili in base ai ruoli.
  • Limitazione dell'accesso agli oggetti di metadati in base al ruolo.
  • Limitazione dell'accesso ai dettagli dell'oggetto in base al ruolo.
  • Limitazione dell'accesso agli oggetti dati in base a ruoli e parametri di sessione.
  • Limitazione dell'accesso interattivo ai dati e ai moduli eseguibili.
  • Alcune restrizioni sull'esecuzione del codice.

In generale, lo schema di accesso ai dati utilizzato è abbastanza tipico per i sistemi informativi di questo livello. Tuttavia, in relazione a questa implementazione di un'architettura client-server a tre livelli, ci sono diversi aspetti fondamentali che portano ad un numero relativamente elevato di vulnerabilità:

  1. Un gran numero di fasi di elaborazione dei dati e ad ogni fase possono essere applicate regole diverse per l'accesso agli oggetti.

    Uno schema alquanto semplificato delle fasi del trattamento dei dati rilevanti dal punto di vista della sicurezza è mostrato nella Fig. 1. Regola generale per 1C è ridurre le restrizioni man mano che si scende in questo schema, quindi, utilizzando una vulnerabilità su uno dei livelli superiori possono sconvolgere il sistema a tutti i livelli.

  2. Procedure non sufficientemente consolidate per il monitoraggio dei dati trasmessi quando si passa da un livello all'altro.

    Sfortunatamente, non tutti i meccanismi interni del sistema sono perfettamente debuggati, soprattutto per i meccanismi non interattivi, il cui debugging è sempre più dispendioso in termini di manodopera da un lato, ma dall'altro più responsabile. Questa "malattia" non è un problema esclusivo di 1C; si trova in molti prodotti server della maggior parte dei fornitori. Solo negli ultimi anni l’attenzione verso questi problemi è aumentata in modo significativo.

  3. Qualifiche medie non sufficientemente elevate di sviluppatori e amministratori di sistema, ereditate dalla versione precedente.

    I prodotti della linea 1C:Enterprise erano inizialmente focalizzati sulla facilità di sviluppo e supporto e sul lavoro in piccole organizzazioni, quindi non sorprende che storicamente si sia sviluppato che una parte significativa degli "sviluppatori" di soluzioni applicative e degli "amministratori" di i sistemi non dispongono di conoscenze e competenze sufficienti per lavorare con un prodotto molto più complesso, ovvero la versione 8.0. Il problema è aggravato dalla pratica adottata dalle società affiliate di insegnare “in combattimento” a spese dei clienti, senza affrontare sistematicamente la questione. È necessario rendere omaggio alla società 1C che negli ultimi anni questa situazione è stata gradualmente corretta: le società in franchising serie hanno iniziato ad adottare un approccio più responsabile al problema della selezione e formazione del personale, al livello di supporto informatico da l'azienda 1C è aumentata notevolmente, sono apparsi programmi di certificazione mirati ad un elevato livello di servizio; ma la situazione non può essere corretta immediatamente, quindi questo fattore dovrebbe essere preso in considerazione quando si analizza la sicurezza del sistema.

  4. La piattaforma è relativamente giovane.

    Tra prodotti con focus e finalità di utilizzo simili, questa è una delle soluzioni più giovani. La funzionalità della piattaforma è stata più o meno stabilita meno di un anno fa. Allo stesso tempo, ogni versione della piattaforma, a partire dalla 8.0.10 (fu in questa versione che furono implementate quasi tutte le attuali funzionalità del sistema) divenne significativamente più stabile delle precedenti. La funzionalità delle soluzioni applicative standard continua a crescere a passi da gigante, sebbene venga utilizzata solo la metà delle capacità della piattaforma. Naturalmente, in tali condizioni possiamo parlare di stabilità in modo piuttosto condizionale, ma in generale bisogna riconoscere che per molti aspetti le soluzioni sulla piattaforma 1C 8.0 sono significativamente più avanti in termini di funzionalità e prestazioni (e spesso in stabilità) di soluzioni simili sulla piattaforma 1C piattaforma 7.7.

Pertanto, il sistema (e, possibilmente, una soluzione applicativa standard) viene distribuito nell'azienda e installato sui computer. Prima di tutto, è necessario creare un ambiente in cui abbia senso impostare la sicurezza 1C, e per questo deve essere configurata in modo tale da soddisfare il presupposto che la sicurezza del sistema sia influenzata in modo significativo dalle impostazioni del sistema.

Seguire le regole generali per impostare la sicurezza.

Non si può parlare di sicurezza delle informazioni di un sistema se non vengono seguiti i principi di base della creazione di sistemi sicuri. Assicurati che siano soddisfatte almeno le seguenti condizioni:

  • L'accesso ai server è fisicamente limitato e il loro funzionamento ininterrotto è assicurato:
    • le apparecchiature server soddisfano i requisiti di affidabilità, è stata adeguata la sostituzione delle apparecchiature server difettose, per le aree particolarmente critiche vengono utilizzati schemi con duplicazione dell'hardware (RAID, alimentazione da più fonti, più canali di comunicazione, ecc.);
    • i server si trovano in una stanza chiusa a chiave e tale stanza viene aperta solo per la durata del lavoro che non può essere svolto da remoto;
    • Solo una o due persone hanno il diritto di aprire la sala server; in caso di emergenza è stato sviluppato un sistema di notifica per le persone responsabili;
    • è garantita l'alimentazione ininterrotta dei server
    • siano garantite le normali condizioni climatiche di funzionamento dell'apparecchiatura;
    • nella sala server è presente l'allarme antincendio, non vi è rischio di allagamento (soprattutto per il primo e l'ultimo piano);
  • Le impostazioni della rete e dell'infrastruttura informatica dell'azienda sono completate correttamente:
    • I firewall sono installati e configurati su tutti i server;
    • tutti gli utenti e i computer sono autorizzati sulla rete, le password sono abbastanza complesse da non poter essere indovinate;
    • gli operatori di sistema hanno diritti sufficienti per lavorare normalmente con esso, ma non hanno diritti per azioni amministrative;
    • gli strumenti antivirus sono installati e abilitati su tutti i computer della rete;
    • È auspicabile che gli utenti (ad eccezione degli amministratori di rete) non dispongano di diritti amministrativi sulle workstation client;
    • l'accesso a Internet e ai supporti di memorizzazione rimovibili dovrebbe essere regolamentato e limitato;
    • è necessario configurare il controllo del sistema degli eventi di sicurezza;
  • Sono state risolte le principali problematiche organizzative:
    • gli utenti hanno qualifiche sufficienti per lavorare con 1C e hardware;
    • gli utenti vengono informati della responsabilità per la violazione delle regole di funzionamento;
    • per ciascun elemento materiale del sistema informativo sono stati nominati i responsabili finanziari;
    • tutte le unità del sistema sono sigillate e chiuse;
    • Prestare particolare attenzione all'istruzione e alla supervisione degli addetti alle pulizie, dei lavoratori edili e degli elettricisti. Queste persone potrebbero, per negligenza, causare danni non paragonabili al danno intenzionale causato da un utente senza scrupoli del sistema.

Attenzione! Questo elenco non è esaustivo, ma descrive solo ciò che spesso si perde quando si implementa un sistema informativo abbastanza complesso e costoso!

  • MS SQL Server, server applicativo e parte client vengono eseguiti su computer diversi, le applicazioni server vengono eseguite con i diritti di utenti Windows appositamente creati;
  • Per MS SQL Server
    • è impostata la modalità di autorizzazione mista
    • Gli utenti MS SQL inclusi nel ruolo serveradmin non partecipano al lavoro 1C,
    • per ogni IB 1C è stato creato un utente MS SQL separato che non ha accesso privilegiato al server,
    • L'utente MS SQL di un IS non ha accesso all'altro IS;
  • Gli utenti non hanno accesso diretto al server delle applicazioni e ai file del server MS SQL
  • Le postazioni operatore sono dotate di Windows 2000/XP (non Windows 95/98/Me)

Non trascurare le raccomandazioni degli sviluppatori del sistema e la lettura della documentazione. Materiali importanti sulla configurazione del sistema sono pubblicati sui dischi ITS nella sezione "Raccomandazioni metodologiche". Prestare particolare attenzione ai seguenti articoli:

  1. Funzionalità delle applicazioni che funzionano con il server 1C:Enterprise
  2. Posizionamento dati 1C:Enterprise 8.0
  3. Aggiornamento 1C:Enterprise 8.0 da parte degli utenti Microsoft Windows senza diritti di amministratore
  4. Modifica dell'elenco utenti per conto di un utente che non dispone di diritti amministrativi
  5. Configurazione delle impostazioni del firewall di Windows XP SP2 per eseguire SQL Server 2000 e SQL Server Desktop Engine (MSDE)
  6. Configurazione dei parametri COM+ Windows XP SP2 per l'esecuzione del server 1C:Enterprise 8.0
  7. Configurazione delle impostazioni del firewall di Windows XP SP2 per il server 1C:Enterprise 8.0
  8. Configurazione delle impostazioni del firewall di Windows XP SP2 per HASP License Manager
  9. Creazione di un backup base informativa utilizzando SQLServer2000
  10. Problemi di installazione e configurazione 1C:Enterprise 8.0 nella versione "client-server".(uno degli articoli più importanti)
  11. Peculiarità Impostazioni di Windows Server 2003 durante l'installazione del server 1C:Enterprise 8.0
  12. Regolamentazione dell'accesso degli utenti alla base informativa nella versione client-server(uno degli articoli più importanti)
  13. Server 1C: server aziendale e SQL
  14. Procedura dettagliata di installazione per 1C:Enterprise 8.0 nella versione "client-server".(uno degli articoli più importanti)
  15. Utilizzando il linguaggio integrato sul server 1C:Enterprise

Ma quando si legge la documentazione, sii critico nei confronti delle informazioni ricevute, ad esempio, l'articolo "Problemi di installazione e configurazione di 1C: Enterprise 8.0 nella versione client-server" non descrive accuratamente i diritti richiesti per l'utente USER1CV8SERVER. Saranno presenti collegamenti all'elenco seguente, ad esempio [ITS1] indica l'articolo "Caratteristiche delle applicazioni che funzionano con il server 1C:Enterprise". Tutti i collegamenti agli articoli si riferiscono all'ultimo numero di ITS al momento della stesura di questo articolo (gennaio 2006)

Utilizza le funzionalità di autorizzazione combinate con l'autorizzazione di Windows per gli utenti

Tra le due possibili modalità di autorizzazione dell'utente: 1C integrata e combinata con l'autorizzazione del sistema operativo Windows, se possibile, dovresti scegliere l'autorizzazione combinata. Ciò consentirà agli utenti di non essere confusi con più password durante il lavoro, ma non ridurrà il livello di sicurezza del sistema. Tuttavia, anche per gli utenti che utilizzano solo l'autorizzazione di Windows, è altamente consigliabile impostare una password al momento della creazione e solo dopo disabilitare l'autorizzazione 1C per questo utente. Per garantire il ripristino del sistema in caso di distruzione della struttura di Active Directory, è necessario lasciare almeno un utente che possa accedere al sistema utilizzando l'autorizzazione 1C.

Quando si creano ruoli della soluzione applicativa, non aggiungere diritti “di riserva”

Ciascun ruolo della soluzione applicativa deve riflettere l'insieme minimo di diritti richiesti per eseguire le azioni definite da questo ruolo. Tuttavia, alcuni ruoli potrebbero non essere utilizzati in modo indipendente. Ad esempio, per il lancio interattivo trattamenti esterni Puoi creare un ruolo separato e aggiungerlo a tutti gli utenti che necessitano di utilizzare l'elaborazione esterna.

Esaminare regolarmente i registri e i protocolli operativi del sistema

Se possibile, regolamentare e automatizzare la visualizzazione dei log e dei protocolli di funzionamento del sistema. Con una corretta configurazione e una revisione regolare dei log (filtrando solo in base agli eventi importanti), le azioni non autorizzate possono essere rilevate tempestivamente o addirittura prevenute durante la fase di preparazione.

Alcune funzionalità della versione client-server

Questa sezione descrive alcune delle caratteristiche operative dell'opzione client-server e il loro impatto sulla sicurezza. Per maggiore comodità di lettura si utilizzano le seguenti notazioni:

Attenzione! descrizione della vulnerabilità

Memorizzazione delle informazioni che controllano l'accesso al sistema

Memorizzazione di un elenco di utenti di sicurezza delle informazioni

Tutte le informazioni sull'elenco degli utenti di questa sicurezza informatica e sui ruoli a loro disposizione sono archiviate nella tabella Params nel database MS SQL (vedere [ITS2]). Osservando la struttura e il contenuto di questa tabella, diventa ovvio che tutte le informazioni dell'utente sono archiviate in un record con il valore del campo FileName "users.usr".

Poiché presupponiamo che gli utenti non abbiano accesso al database MS SQL, questo fatto di per sé non può essere utilizzato da un utente malintenzionato, tuttavia, se è possibile eseguire codice in MS SQL, ciò "apre la porta" per ottenere qualsiasi(! ) accesso dal 1C . Lo stesso meccanismo (con piccole modifiche) può essere utilizzato anche nella versione file del sistema, il che, tenendo conto delle caratteristiche della versione file, ne esclude completamente l'applicabilità nella creazione di sistemi sicuri.

Raccomandazione: Al momento non esiste alcun modo per proteggere completamente l'applicazione da tali modifiche, se non l'utilizzo di trigger a livello di MS SQL Server, che invece possono causare problemi durante l'aggiornamento della versione della piattaforma o la modifica dell'elenco dei utenti. Per tenere traccia di tali modifiche è possibile utilizzare il log 1C (facendo attenzione agli accessi “sospetti” in modalità configuratore senza specificare l'utente) oppure mantenere SQL Profiler costantemente in esecuzione (che avrà un impatto estremamente negativo sulle prestazioni del sistema) o configurare gli Alerts meccanismo (molto probabilmente insieme utilizzando i trigger)

Memorizzazione delle informazioni sull'elenco IS sul server

Per ciascun server delle applicazioni 1C, vengono archiviate informazioni sull'elenco dei database MS SQL ad esso collegati. Ogni infobase utilizza la propria stringa di connessione dal server delle applicazioni e dal server MS SQL per funzionare. Le informazioni sulle infobase registrate sul server delle applicazioni, insieme alle stringhe di connessione, sono archiviate nel file srvrib.lst, che si trova sul server nella directory<Общие данные приложений>/1C/1Cv8 (ad esempio, C:/Documents and Settings/All Users/Dati applicazioni/1C/1Cv8/srvrib.lst). Per ogni sistema di sicurezza delle informazioni viene memorizzata una stringa di connessione completa, inclusa la password dell'utente MS SQL quando si utilizza un modello di autorizzazione MS SQL misto. È la presenza di questo file che fa temere un accesso non autorizzato al database MS SQL e se, contrariamente alle raccomandazioni, un utente privilegiato (ad esempio "sa") viene utilizzato per accedere ad almeno un database, allora in Oltre alla minaccia per la sicurezza delle informazioni, esiste una minaccia per l'intero sistema che utilizza MS SQL.

È interessante notare che l'utilizzo dell'autorizzazione mista e dell'autorizzazione Windows su un server MS SQL porta a diversi tipi di problemi nell'accesso a un determinato file. Quindi le principali proprietà negative dell'autorizzazione di Windows saranno:

  • Gestione di tutta la sicurezza delle informazioni sul server delle applicazioni e sul server MS SQL con un unico insieme di diritti (molto probabilmente ridondante)
  • Dal processo del server delle applicazioni 1C (o in generale dall'utente USER1CV8SERVER o equivalente) senza specificare una password, è possibile connettersi facilmente a qualsiasi sicurezza informatica senza specificare una password

D'altra parte, potrebbe essere più difficile per un utente malintenzionato eseguire codice arbitrario dal contesto dell'utente USER1CV8SERVER piuttosto che ottenere il file specificato. A proposito, la presenza di un file del genere è un altro argomento a favore della distribuzione delle funzioni del server su computer diversi.

Raccomandazione: Il file srvrib.lst dovrebbe essere accessibile solo dal processo server. Assicurati di configurare il controllo per modificare questo file.

Sfortunatamente, per impostazione predefinita questa vita non è quasi protetto dalla lettura, di cui bisogna tenere conto durante l'implementazione del sistema. L'opzione ideale sarebbe che il server delle applicazioni impedisca la lettura e la scrittura di questo file durante l'esecuzione (incluse la lettura e la scrittura da parte delle connessioni utente in esecuzione su questo server).

Mancanza di autorizzazione durante la creazione della sicurezza delle informazioni sul server

Attenzione! L'errore di mancanza di autorizzazione è stato corretto nella versione 8.0.14 della piattaforma 1C:Enterprise. In questa versione è apparso il concetto di "1C:Enterprise Server Administrator", ma finché l'elenco degli amministratori è specificato sul server, il sistema funziona come descritto di seguito, quindi non dimenticare questa possibile funzionalità.

Probabilmente la più grande vulnerabilità di questa sezione è la capacità di aggiungere quasi illimitatamente la sicurezza delle informazioni al server delle applicazioni, in conseguenza della quale qualsiasi utente che ottiene l'accesso a una connessione al server delle applicazioni ottiene automaticamente la capacità di eseguire codice arbitrario sul server delle applicazioni. . Consideriamolo con un esempio.

Il sistema deve essere installato come segue

  • MS SQL Server 2000 (ad esempio, nome di rete SRV1)
  • Server 1C:Enterprise 8.0 (nome della rete SRV2)
  • Parte client 1C:Enterprise 8.0 (nome della rete WS)

Si presuppone che l'utente (di seguito UTENTE) che opera sul WS abbia almeno un accesso minimo ad uno dei sistemi di sicurezza informatica registrati su SRV2, ma non abbia accesso privilegiato a SRV1 e SRV2. In generale, la combinazione delle funzioni dei computer elencati non influisce sulla situazione. Il sistema è stato configurato tenendo conto delle raccomandazioni presenti nella documentazione e sui dischi ITS. La situazione è mostrata in Fig. 2.


  • configurare la sicurezza COM+ sul server delle applicazioni in modo che solo gli utenti 1C abbiano il diritto di connettersi al processo del server delle applicazioni (maggiori dettagli [ITS12]);
  • il file srvrib.lst deve essere di sola lettura per l'utente USER1CV8SERVER (per aggiungere una nuova sicurezza informatica al server, consentire temporaneamente la scrittura);
  • Per connettersi a MS SQL utilizzare esclusivamente il protocollo TCP/IP, in questo caso è possibile:
    • limitare le connessioni utilizzando un firewall;
    • configurare l'uso di una porta TCP non standard, che complicherà la connessione degli "outsider" IB 1C;
    • utilizzare la crittografia dei dati trasmessi tra il server delle applicazioni e il server SQL;
  • configurare il firewall del server in modo che l'utilizzo di server MS SQL di terze parti sia impossibile;
  • utilizzare strumenti di sicurezza intranet per escludere la possibilità che un computer non autorizzato appaia sulla rete locale (IPSec, policy di sicurezza di gruppo, firewall, ecc.);
  • Non concedere in nessun caso all'utente USER1CV8SERVER diritti amministrativi sul server delle applicazioni.

Utilizzando il codice in esecuzione sul server

Quando si utilizza la versione client-server di 1C, lo sviluppatore può distribuire l'esecuzione del codice tra il client e il server delle applicazioni. Affinché il codice (procedura o funzione) venga eseguito solo sul server, è necessario inserirlo in un modulo generale per il quale è impostata la proprietà “Server” e, nel caso in cui l'esecuzione del modulo è consentita non solo su sul server, inserire il codice nella sezione riservata “#If Server ":

#Se Server Allora
Function OnServer(Param1, Param2 = 0) Export // Questa funzione, nonostante la sua semplicità, viene eseguita sul server
Parametro1 = Parametro1 + 12;
Restituisce Param1;
EndFunction
#Finisci se

Quando si utilizza codice eseguito sul server è necessario tenere presente che:

  • il codice viene eseguito con diritti USER1CV8SERVER sul server delle applicazioni (sono disponibili oggetti COM e file del server);
  • tutte le sessioni utente vengono eseguite da un'istanza del servizio, quindi, ad esempio, un overflow dello stack sul server causerà la disconnessione di tutti gli utenti attivi;
  • il debug dei moduli server è difficile (ad esempio, non è possibile impostare un punto di interruzione nel debugger), ma deve essere fatto;
  • il trasferimento del controllo dal client al server delle applicazioni e viceversa può richiedere risorse significative con grandi volumi di parametri trasferiti;
  • utilizzo di strumenti interattivi (moduli, documenti di fogli di calcolo, finestre di dialogo), i report esterni e l'elaborazione in codice sul server dell'applicazione sono impossibili;
  • non è consentito l'utilizzo di variabili globali (variabili del modulo applicativo dichiarate con l'indicazione “Export”);

Per maggiori dettagli, vedere [ITS15] e altri articoli ITS.

Il server delle applicazioni deve avere requisiti di affidabilità speciali. In un sistema client-server correttamente costruito, devono essere soddisfatte le seguenti condizioni:

  • nessuna azione dell'applicazione client deve interrompere il funzionamento del server (ad eccezione dei casi amministrativi);
  • il server non può eseguire il codice del programma ricevuto dal client;
  • le risorse devono essere distribuite “equamente”. connessioni client, garantendo la disponibilità del server indipendentemente dal carico corrente;
  • in assenza di blocco dei dati, le connessioni dei client non dovrebbero influenzare il lavoro reciproco;
  • non sul server interfaccia utente, ma occorre sviluppare strumenti di monitoraggio e registrazione;

In generale, il sistema 1C è costruito in modo tale da avvicinarsi di più a questi requisiti (ad esempio, è impossibile forzare l'esecuzione dell'elaborazione esterna sul server), ma esistono ancora alcune caratteristiche spiacevoli, quindi:

Raccomandazione: Quando si sviluppa un server runtime, si consiglia di aderire al principio dell'interfaccia minima. Quelli. il numero di voci nei moduli server dall'applicazione client dovrebbe essere molto limitato e i parametri dovrebbero essere rigorosamente regolamentati. Raccomandazione: Quando si ricevono parametri di procedure e funzioni sul server, è necessario convalidare i parametri (controllare che i parametri corrispondano al tipo e all'intervallo di valori previsti). Ciò non viene fatto nelle soluzioni standard, ma è altamente auspicabile introdurre una convalida obbligatoria nei propri sviluppi. Raccomandazione: Quando si genera il testo della richiesta (e in particolare il parametro del comando Esegui) sul lato server, non utilizzare stringhe ricevute dall'applicazione client.

Una raccomandazione generale sarebbe quella di familiarizzare con i principi della costruzione sicura ragnatela-applicazioni di database e lavorare su principi simili. Le somiglianze sono infatti notevoli: in primo luogo, come un'applicazione web, l'application server è uno strato intermedio tra il database e l'interfaccia utente (la differenza principale è che il web server costituisce l'interfaccia utente); in secondo luogo, dal punto di vista della sicurezza, non ci si può fidare dei dati ricevuti dal cliente, perché è possibile lanciare report ed elaborazioni esterne.

Passaggio dei parametri

Passare parametri ad una funzione (procedura) eseguita sul server è una questione piuttosto delicata. Ciò è dovuto principalmente alla necessità di trasferirli tra il server delle applicazioni e i processi client. Quando il controllo passa dal lato client al lato server, tutti i parametri trasmessi vengono serializzati, trasferiti al server, dove vengono “spacchettati” e utilizzati. Quando si passa dal lato server al lato client, il processo è invertito. Va notato qui che questo schema gestisce correttamente il passaggio dei parametri per riferimento e per valore. Quando si passano i parametri, si applicano le seguenti restrizioni:

  • Solo valori non mutabili (cioè i cui valori non possono essere modificati) possono essere trasferiti tra il client e il server (in entrambe le direzioni): tipi primitivi, riferimenti, raccolte universali, valori di enumerazione di sistema, archiviazione di valori. Se provi a passare qualcos'altro, l'applicazione client si blocca (anche se il server tenta di passare un parametro errato).
  • Non è consigliabile trasferire grandi quantità di dati durante il passaggio dei parametri (ad esempio, stringhe di oltre 1 milione di caratteri), poiché ciò potrebbe influire negativamente sulle prestazioni del server.
  • Non è possibile passare parametri contenenti un riferimento ciclico, sia dal server al client e viceversa. Se provi a passare un parametro di questo tipo, l'applicazione client si blocca (anche se il server tenta di passare il parametro errato).
  • Non è consigliabile trasferire raccolte di dati molto complesse. Quando si tenta di passare un parametro con un livello di annidamento molto elevato, il server si blocca (! ).

Attenzione! La caratteristica più fastidiosa al momento è probabilmente l'errore nel passaggio di raccolte complesse di valori. Quindi, ad esempio, il codice: Livello di nidificazione = 1250;
M = Nuova matrice;
Parametro superato = M;
Per conto = 1 per livello di ciclo di nidificazione
MVInt = Nuovo array;
M.Add(MVInt);
M = MVint;
FineCiclo;
FunzioneServer(Parametro Passato);

Porta all'arresto di emergenza del server con la disconnessione di tutti gli utenti e ciò avviene prima che il controllo venga trasferito al codice nel linguaggio integrato.

Utilizzo di funzioni non sicure sul lato server.

Non tutti gli strumenti linguistici integrati possono essere utilizzati nel codice eseguito sul server delle applicazioni, ma anche tra gli strumenti disponibili ci sono molti costrutti “problematici” che possono essere grossolanamente classificati come segue:

  • in grado di fornire la possibilità di eseguire codice non contenuto nella configurazione (gruppo "Code Execution")
  • in grado di fornire all'applicazione client informazioni su file e sistema operativo utente o eseguire azioni non correlate all'utilizzo dei dati ("Violazione dei diritti")
  • in grado di causare un crash del server o di utilizzare risorse molto grandi (gruppo "Server crash")
  • in grado di causare un guasto del client (gruppo di guasti del client) – questo tipo non è considerato. Esempio: passaggio di un valore mutabile al server.
  • errori negli algoritmi di programmazione (loop infiniti, ricorsione illimitata, ecc.) (“Errori di programmazione”)

I principali progetti problematici a me noti (con esempi) sono elencati di seguito:

Procedura Esegui(<Строка>)

Esecuzione del codice. Consente di eseguire una parte di codice che gli viene passata come valore stringa. Quando vengono utilizzati sul server, è necessario assicurarsi che i dati ricevuti dal client non vengano utilizzati come parametro. Ad esempio, non è consentito il seguente utilizzo:

#Se Server Allora
ProceduraSuServer(Param1) Esporta
Esegui(Param1);
Fine della procedura
#Finisci se

Digitare "COMObject" (costruttore New COMObject(<Имя>, <Имя сервера>))

Crea un oggetto COM dell'applicazione esterna con diritti USER1CV8SERVER sul server delle applicazioni (o su un altro computer specificato). Se utilizzato su un server, assicurarsi che i parametri non vengano passati dall'applicazione client. Tuttavia, lato server, è efficace utilizzare questa funzionalità durante l'importazione/esportazione, l'invio di dati su Internet, l'implementazione di funzioni non standard, ecc.

Funzione GetCOMOggetto(<Имя файла>, <Имя класса COM>)
Violazione dei diritti ed esecuzione del codice. Simile al precedente, ottiene solo l'oggetto COM corrispondente al file.
Procedure e funzioni ComputerName(), TemporaryFileDirectory(), ProgramDirectory(), WindowsUsers()
Violazione dei diritti. Eseguendoli sul server, consentono di scoprire i dettagli dell'organizzazione del sottosistema server. Se utilizzati su un server, assicurarsi che i dati non vengano trasferiti al client o non siano accessibili agli operatori senza l'autorizzazione adeguata. Prestare particolare attenzione al fatto che i dati possono essere restituiti in un parametro passato per riferimento.
Procedure e funzioni per lavorare con i file (CopyFile, FindFiles, MergeFiles e molti altri), nonché Tipi di file.

Violazione dei diritti. Permettono, eseguendoli sul server, di ottenere l'accesso condiviso ai file locali (e situati nella rete) accessibili con i diritti utente USER1CV8SERVER. Se utilizzato consapevolmente, è possibile implementare in modo efficace attività come l'importazione/esportazione di dati sul server.

Assicurati di controllare i tuoi diritti utente 1C prima di utilizzare queste funzioni. Per verificare i diritti utente, è possibile utilizzare il seguente costrutto nel modulo server:

#Se Server Allora
Procedura PerformWorkWithFile() Esportazione
RoleAdministrator = Metadata.Roles.Administrator;
Utente = SessionParameters.CurrentUser;
Se User.Roles.Contains(RoleAdministrator) Allora
//Il codice per lavorare con i file viene eseguito qui
finisci se;
#Finisci se

Assicurati di controllare i parametri se usi queste procedure e funzioni, altrimenti c'è il rischio di causare accidentalmente o consapevolmente danni irreparabili al server delle applicazioni 1C, ad esempio, quando si esegue il seguente codice sul server:

Percorso = "C:\Documents and Settings\Tutti gli utenti\Dati applicazioni\1C\1Cv8\";
MoveFile(Percorso + "srvrib.lst", Percorso + "Ecco dove va il file");

Dopo aver eseguito tale codice sul server, se l'utente USER1CV8SERVER ha i diritti per modificarlo, come descritto sopra, e dopo aver riavviato il processo del server (per impostazione predefinita, 3 minuti dopo l'uscita di tutti gli utenti), sorgerà una GRANDE domanda sull'avvio del server . Ma è anche possibile eliminare completamente i file...

Tipi "XBase", "BinaryData", "XML Reader", "XML Writer", "XSL Transformation", "ZipFile Writer", "ZipFile Reader", "Text Reader", "Text Writer"
Violazione dei diritti. Consentono, eseguendoli sul server, di accedere a file locali (e situati in rete) di determinati tipi e di leggerli/scriverli con i diritti utente USER1CV8SERVER. Se utilizzato consapevolmente, è possibile implementare in modo efficace attività come l'importazione/esportazione di dati sul server, la registrazione del funzionamento di determinate funzioni e la risoluzione di compiti amministrativi. In generale, le raccomandazioni coincidono con il paragrafo precedente, ma dovresti considerare la possibilità di trasferire dati da questi file (ma non oggetti di tutti questi tipi) tra la parte client e quella server.
Digita "Informazioni di sistema"
Violazione dei diritti. Consente di ottenere dati sul server dell'applicazione in caso di utilizzo errato e trasferimento dei dati alla parte client dell'applicazione. Si consiglia di limitare il diritto d'uso durante l'utilizzo.
Tipi "ConnessioneInternet", "InternetMail", "InternetProxy", "ConnessioneHTTP", "ConnessioneFTP"

Violazione dei diritti. Se utilizzato su un server, si connette a un PC remoto da un server di applicazioni con i diritti USER1CV8SERVER. Raccomandazioni:

  • Controllo dei parametri durante la chiamata dei metodi.
  • Controllo dei diritti utente 1C.
  • Gravi restrizioni sui diritti dell'utente USER1CV8SERVER di accedere alla rete.
  • Configurazione corretta del firewall sul server delle applicazioni 1C.

Se utilizzato correttamente, è conveniente organizzare, ad esempio, l'invio di e-mail da un server di applicazioni.

Tipi "InformationBaseUserManager", "InformationBaseUser"

Violazione dei diritti. Se utilizzato in modo errato (in un modulo privilegiato), è possibile aggiungere utenti o modificare i parametri di autorizzazione degli utenti esistenti.

Formato della funzione

Arresto del server. SÌ! Questa funzione apparentemente innocua, se i suoi parametri non vengono controllati ed eseguiti sul server, può causare il crash dell'applicazione server. L'errore si verifica, ad esempio, durante la formattazione dei numeri e l'utilizzo della modalità di visualizzazione degli zeri iniziali e di un numero elevato di caratteri

Formato(1, "CHZ=999; CHVN=");

Spero che questo errore venga corretto nei prossimi rilasci della piattaforma, ma nel frattempo in tutte le chiamate a questa funzione eseguibili sul server controllate i parametri di chiamata.

Procedure e funzioni per il salvataggio dei valori (ValueInRowInt, ValueInFile)
Arresto del server. Queste funzioni non gestiscono i riferimenti circolari nelle raccolte o negli annidamenti molto profondi, quindi potrebbero bloccarsi in alcuni casi molto speciali.

Errori nei valori limite e dei parametri speciali nelle funzioni. Controllo dell'esecuzione.

Uno dei problemi che potresti incontrare quando usi un server è l'elevata "responsabilità" delle funzioni del server (la possibilità che l'intera applicazione server si blocchi a causa di un errore in una connessione e l'utilizzo di uno "spazio risorse" per tutte le connessioni) . Da qui la necessità di controllare i principali parametri di runtime:

  • Per le funzioni linguistiche integrate, controlla i parametri di avvio (un buon esempio è la funzione "Formato")
  • Quando si utilizzano i loop, assicurarsi che la condizione di uscita dal loop sia soddisfatta. Se il ciclo è potenzialmente infinito, limita artificialmente il numero di iterazioni: MaximumIterationCounterValue = 1000000;
    Contatore iterazioni = 1;
    Ciao
    FunctionWhichMayNotReturnFalseValue()
    AND (Conteggio iterazioni<МаксимальноеЗначениеСчетчикаИтераций) Цикл

    //.... Corpo del ciclo
    Contatore iterazioni = Contatore iterazioni + 1;
    FineCiclo;
    Se Contatore iterazioni>Valore massimo del contatore iterazioni Allora
    //.... gestisce l'evento di un'esecuzione del ciclo eccessivamente lunga
    finisci se;

  • Quando si utilizza la ricorsione, limitare il livello massimo di annidamento.
  • Durante la formazione e l'esecuzione delle query, cercare di evitare selezioni molto lunghe e selezioni di una grande quantità di informazioni (ad esempio, quando si utilizza la condizione "IN HIERARCHY", non utilizzare un valore vuoto)
  • Quando si progetta una base di informazioni, fornire una riserva sufficientemente ampia di profondità di bit per i numeri (altrimenti l'addizione e la moltiplicazione diventano non commutative e non associative, il che rende difficile il debug)
  • Nelle query eseguibili, verificare la logica operativa per la presenza di valori NULL e il corretto funzionamento delle condizioni e delle espressioni della query utilizzando NULL.
  • Quando si utilizzano le raccolte, controllare la possibilità di trasferirle tra il server delle applicazioni e il lato client.

Utilizzo dell'accesso terminale al lato client per limitare l'accesso

Spesso è possibile trovare consigli per utilizzare l'accesso al terminale per limitare l'accesso ai dati e migliorare le prestazioni eseguendo codice lato client sul server terminal. Sì, se configurato correttamente, l'utilizzo dell'accesso al terminale può effettivamente aumentare il livello generale di sicurezza del sistema, ma, sfortunatamente, spesso si riscontra il fatto che con l'uso pratico la sicurezza del sistema diminuisce solo. Proviamo a capire a cosa è collegato. Ora esistono due mezzi comuni per organizzare l'accesso al terminale: Microsoft Terminal Services (protocollo RDP) e Citrix Metaframe Server (protocollo ICA). In generale, gli strumenti Citrix forniscono opzioni di amministrazione degli accessi molto più flessibili, ma il prezzo di queste soluzioni è molto più alto. Considereremo solo le caratteristiche di base comuni a entrambi i protocolli che possono ridurre il livello generale di sicurezza. Esistono solo tre pericoli principali quando si utilizza l'accesso al terminale:
  • Possibilità di bloccare il lavoro di altri utenti sequestrando quantità eccessive di risorse
  • Accesso ai dati di altri utenti.
  • Copia non autorizzata di dati dal server terminale al computer dell'utente

In ogni caso, Terminal Services ti consente di:

  • Aumentare l'affidabilità del lavoro (se si verifica un guasto sul computer terminale, l'utente può successivamente continuare a lavorare dallo stesso posto)
  • Limitare l'accesso all'applicazione client e ai file salvati.
  • Trasferire il carico di elaborazione dalla workstation dell'utente al server di accesso al terminale
  • Gestisci le impostazioni di sistema in modo più centralizzato. Per gli utenti, le impostazioni salvate saranno valide indipendentemente dal computer da cui hanno effettuato l'accesso al sistema.
  • In alcuni casi è possibile utilizzare una soluzione terminale per l'accesso remoto al sistema.

È necessario limitare il numero di possibili connessioni al server terminal per un utente

A causa della "golosità" dell'applicazione client 1C in termini di risorse, è imperativo limitare il numero massimo di connessioni simultanee di un utente (operatore) al server terminal. Una connessione utilizzata attivamente può utilizzare fino a 300 MB di memoria con una sola istanza dell'applicazione. Oltre alla memoria, viene utilizzato attivamente il tempo della CPU, il che non contribuisce alla stabilità degli utenti di questo server. Oltre a impedire un uso eccessivo delle risorse del server, tale restrizione può impedire l'uso di quelle di qualcun altro account. Implementato dalle impostazioni standard del server terminal.

Non è necessario consentire l'esecuzione simultanea di più di una o due applicazioni client 1C in una connessione

Dettato dalle stesse ragioni del paragrafo precedente, ma tecnicamente più difficili da attuare. Il problema è che è quasi impossibile impedire il riavvio di 1C utilizzando gli strumenti del server terminal (il motivo verrà spiegato di seguito), quindi è necessario implementare questa funzionalità a livello della soluzione applicativa (che non è nemmeno una buona soluzione, poiché le sessioni potrebbero rimanere “sospese” per un po' di tempo. Se l'applicazione viene terminata in modo errato, è necessario perfezionare la soluzione applicativa nel modulo dell'applicazione e in alcuni libri di consultazione, il che complicherà l'uso degli aggiornamenti da 1C). È altamente auspicabile lasciare all'utente la possibilità di eseguire 2 applicazioni per poter eseguire alcune azioni (ad esempio, la generazione di report) in background: l'applicazione client, sfortunatamente, è in realtà a thread singolo.

Non è consigliabile concedere i diritti di accesso al server terminal agli utenti che hanno il diritto di eseguire attività informatiche ad uso intensivo di risorse in 1C o impedire tale avvio mentre altri utenti stanno lavorando attivamente.

Naturalmente è meglio lasciare l'accesso al server terminale solo agli utenti che non utilizzano attività come data mining, diagrammi geografici, importazione/esportazione e altre attività che caricano seriamente la parte client dell'applicazione. Se è ancora necessario consentire tali attività, è necessario: informare l'utente che queste attività possono influenzare le prestazioni di altri utenti, registrare l'inizio e la fine di tale processo nel registro, consentirne l'esecuzione solo in un momento regolamentato tempo, ecc.

È necessario assicurarsi che ogni utente abbia diritti di scrittura solo su directory rigorosamente definite sul server terminale e che altri utenti non abbiano accesso ad esse.

In primo luogo, se non si limita la possibilità di scrivere nelle directory condivise (come la directory in cui è installato 1C), un utente malintenzionato può comunque modificare il comportamento del programma per tutti gli utenti. In secondo luogo, i dati di un utente (file temporanei, file per il salvataggio delle impostazioni del report, ecc.) non dovrebbero in nessun caso essere accessibili a un altro utente del terminal server - in generale, durante la normale configurazione, questa regola viene seguita. In terzo luogo, l'aggressore ha ancora la possibilità di "sporcare" la partizione in modo che non rimanga spazio sul disco rigido. So che mi obietteranno che il sistema operativo Windows, a partire da Windows 2000, ha un meccanismo di quote, ma si tratta di un meccanismo piuttosto costoso, e non ne ho praticamente mai visto un reale utilizzo.

Se i problemi precedenti relativi alla configurazione dell'accesso erano generalmente abbastanza facili da implementare, allora un compito (apparentemente) semplice come regolare l'accesso degli utenti ai file non viene implementato in modo banale. Innanzitutto, se non viene utilizzato il meccanismo delle quote, è possibile salvare file di grandi dimensioni. In secondo luogo, il sistema è costruito in modo tale che sarà quasi sempre possibile salvare il file in modo che sia disponibile per un altro utente.

Considerando che l'attività è difficile da risolvere completamente, si consiglia di controllare la maggior parte degli eventi dei file

È necessario vietare la connessione (mappatura) dei dispositivi disco, delle stampanti e degli appunti della workstation client.

In RDP e ICA è possibile organizzare la connessione automatica di dischi, stampanti, porte com degli appunti del computer terminale al server. Se esiste questa opportunità, è quasi impossibile impedire il lancio di codice straniero sul server terminale e il salvataggio dei dati da 1C sul client di accesso al terminale. Consenti queste funzionalità solo a chi dispone di diritti amministrativi.

L'accesso ai file di rete dal server terminal dovrebbe essere limitato.

Se ciò non viene fatto, l'utente sarà nuovamente in grado di eseguire codice indesiderato o salvare dati. Poiché il registro regolare non tiene traccia degli eventi dei file (tra l'altro, una buona idea per l'implementazione da parte degli sviluppatori della piattaforma) ed è quasi impossibile impostare un controllo del sistema su tutta la rete (non ci sono abbastanza risorse per mantenerlo), è preferibile che l'utente possa inviare i dati sia per la stampa, sia tramite e-mail. Prestare particolare attenzione a garantire che il server terminal non funzioni direttamente con il supporto rimovibile degli utenti.

In nessun caso si dovrebbe lasciare l'application server sul terminal server quando si crea un sistema sicuro.

Se il server delle applicazioni viene eseguito sullo stesso computer delle applicazioni client, esistono molte possibilità di interromperne il normale funzionamento. Se per qualche motivo è impossibile separare le funzioni del server terminale e del server delle applicazioni, prestare particolare attenzione all'accesso dell'utente ai file utilizzati dal server delle applicazioni.

È necessario escludere la possibilità di eseguire tutte le applicazioni tranne 1C:Enterprise sul terminal server.

Questo è uno dei desideri più difficili da realizzare. Cominciamo dal fatto che è necessario configurare correttamente i criteri di sicurezza del gruppo nel dominio. Tutti i modelli amministrativi e i criteri di restrizione software devono essere configurati correttamente. Per metterti alla prova, assicurati che almeno le seguenti funzionalità siano bloccate:

La complessità dell'implementazione di questo requisito porta spesso alla possibilità di avviare una sessione 1C “extra” sul server terminal (anche se le altre applicazioni sono limitate, è fondamentalmente impossibile vietare l'avvio di 1C utilizzando Windows).

Considera le limitazioni del registro regolare (tutti gli utenti utilizzano il programma da un computer)

Ovviamente, poiché gli utenti aprono 1C in modalità terminale, il server terminale verrà registrato nel registro. Il registro non indica da quale computer l'utente si è connesso.

Terminal Server: protezione o vulnerabilità?

Quindi, dopo aver considerato le caratteristiche principali del terminal nord, possiamo dire che il terminal nord può potenzialmente aiutare nell'automazione a distribuire il carico informatico, ma costruire un sistema sicuro è piuttosto difficile. Uno dei casi in cui l'utilizzo di un server terminal è più efficace è quando si esegue 1C senza Esplora risorse in modalità a schermo intero per utenti con funzionalità limitate e un'interfaccia specializzata.

Lavoro della parte cliente

Utilizzo di Internet Explorer (IE)

Una delle condizioni per il normale funzionamento della parte client 1C è l'uso dei componenti Internet Explorer. Devi stare molto attento con questi componenti.

Attenzione! In primo luogo, se un modulo spyware o adware è "allegato" a IE, verrà caricato anche se visualizzi file HTML in 1C. Finora non ho visto alcun uso consapevole di questa funzionalità, ma ho visto in una delle organizzazioni un modulo "spia" caricato da una delle reti pornografiche con 1C in esecuzione (il programma antivirus non è stato aggiornato, i cui sintomi sono stati rilevati : durante l'impostazione del firewall, era chiaro che 1C stava tentando di connettersi a un sito porno sulla porta 80). In realtà, questo è un altro argomento a favore del fatto che la protezione dovrebbe essere globale

Attenzione! In secondo luogo, il sistema 1C consente l'utilizzo di filmati Flash, oggetti ActiveX, VBScript nei documenti HTML visualizzati, l'invio di dati su Internet, persino l'apertura di file PDF (!), anche se in quest'ultimo caso chiede "apri o salva"... In generale, tutto ciò che il tuo cuore desidera. Un esempio di utilizzo non del tutto ragionevole delle funzionalità di visualizzazione e modifica HTML integrate:

  • Crea un nuovo documento HTML (File -> Nuovo -> Documento HTML).
  • Vai alla scheda "Testo" del documento vuoto.
  • Rimuovere il testo (interamente).
  • Vai alla scheda "Visualizza" di questo documento
  • Usando il drag-n-drop, sposta un file con un'estensione SWF (questi sono file di filmati Flash) da un Explorer aperto a una finestra di documento, ad esempio dalla cache del browser, anche se puoi anche usare un giocattolo FLASH per divertimento.
  • Che bello! Puoi eseguire un giocattolo su 1C!

Dal punto di vista della sicurezza del sistema, questo è completamente sbagliato. Finora non ho visto alcun attacco speciale su 1C attraverso questa vulnerabilità, ma molto probabilmente sarà una questione di tempo e del valore delle tue informazioni.

Ci sono altri problemi minori che sorgono quando si lavora con un campo documento HTML, ma i principali sono i due elencati. Tuttavia, se ti avvicini a queste funzionalità in modo creativo, puoi organizzare funzionalità di interfaccia davvero sorprendenti per lavorare con 1C.

Utilizzo di report ed elaborazioni esterne.

Attenzione! Rapporti ed elaborazioni esterne – da un lato – strada conveniente l'implementazione di moduli stampati aggiuntivi, reporting normativo, report specializzati, d'altro canto, un potenziale modo per aggirare molte restrizioni di sicurezza del sistema e interrompere il funzionamento del server dell'applicazione (per un esempio, vedere sopra in “Parametri di passaggio”). Nel sistema 1C esiste un parametro speciale nell'insieme dei diritti per il ruolo "Apertura interattiva dell'elaborazione esterna", ma questo non risolve completamente il problema: per una soluzione completa è necessario restringere la cerchia degli utenti che possono gestire moduli stampati esterni, rapporti normativi e altre funzionalità standard di soluzioni standard implementate utilizzando trattamenti esterni. Ad esempio, per impostazione predefinita in UPP, tutti i ruoli utente principali hanno la capacità di lavorare con una directory di moduli stampati aggiuntivi e questa, in effetti, è la capacità di utilizzare qualsiasi elaborazione esterna.

Utilizzo di meccanismi standard per soluzioni e piattaforme standard (scambio di dati)

Alcuni dei meccanismi standard sono potenzialmente pericolosi e in modi inaspettati.

Stampa elenchi

Qualsiasi elenco (ad esempio, una directory o un registro di informazioni) nel sistema può essere stampato o salvato in un file. Per fare ciò basta utilizzare la funzionalità standard disponibile dal menu contestuale e dal menu “Azioni”:

Tieni presente che praticamente tutto ciò che l'utente vede negli elenchi può essere inviato a file esterni. L'unica cosa che possiamo consigliare è di tenere un registro della stampa dei documenti sui server di stampa. Per form particolarmente critici è necessario configurare il pannello azioni associato al campo protetto della tabella in modo che da tale pannello non sia disponibile la possibilità di visualizzare un elenco e disabilitare il menu contestuale (vedi Figura 6).

Scambio di dati in un database distribuito

Il formato di scambio dati è abbastanza semplice ed è descritto nella documentazione. Se l'utente ha la possibilità di sostituire più file, può apportare modifiche non autorizzate al sistema (sebbene si tratti di un compito piuttosto laborioso). La possibilità di creare un database periferico quando si utilizzano piani di scambio di database distribuiti non dovrebbe essere disponibile per gli operatori ordinari.

Scambio di dati XML standard

Nello scambio dati standard, utilizzato per lo scambio tra configurazioni standard (ad esempio, "Gestione commerciale" e "Contabilità aziendale"), è possibile specificare gestori di eventi per caricare e scaricare oggetti nelle regole di scambio. Ciò viene implementato ottenendo un gestore dal file e la procedura “Esegui()” per l'elaborazione standard del caricamento e scaricamento dei file (la procedura “Esegui()” viene avviata sul lato client). Ovviamente, non è difficile creare un file di scambio così falso che esegua azioni dannose. Per la maggior parte dei ruoli utente delle soluzioni standard, la condivisione è consentita per impostazione predefinita.

Raccomandazione: limitare l'accesso allo scambio XML per la maggior parte degli utenti (lasciandolo solo agli amministratori della sicurezza delle informazioni). Conserva i registri delle esecuzioni di questa elaborazione, salvando il file di scambio, ad esempio, inviandolo per e-mail amministratore della sicurezza delle informazioni prima del download.

Utilizzando report generici, in particolare la Console Report

Un altro problema è l'accesso utente predefinito ai report generici, in particolare al report della Console report. Questo rapporto è caratterizzato dal fatto che consente di eseguire quasi tutte le richieste di sicurezza delle informazioni e, anche se il sistema dei diritti 1C (incluso RLS) è configurato in modo abbastanza rigoroso, consente all'utente di ottenere molte informazioni "extra" e forzare il server a eseguire una richiesta che consumerà tutte le risorse del sistema.

Utilizzo della modalità a schermo intero (modalità desktop)

Uno dei modi efficaci per organizzare interfacce specializzate con accesso limitato alle funzionalità del programma è la modalità a schermo intero della forma principale (e forse unica) dell'interfaccia utilizzata. In questo caso non ci sono problemi di accessibilità, ad esempio il menu "File" e tutte le azioni dell'utente sono limitate dalle funzionalità del modulo utilizzato. Per maggiori dettagli, vedere "Caratteristiche dell'implementazione della modalità desktop" sul disco ITS.

Backup

Il backup per la versione client-server di 1C può essere eseguito in due modi: caricando i dati in un file con estensione dt e creando copie di backup utilizzando SQL. Il primo metodo presenta molti svantaggi: è richiesto l'accesso esclusivo, la creazione di una copia stessa richiede molto più tempo, in alcuni casi (se la struttura di sicurezza delle informazioni viene violata) la creazione di un archivio è impossibile, ma c'è un vantaggio: la dimensione minima di l'archivio. Per il backup SQL è vero il contrario: la creazione di una copia avviene in background utilizzando il server SQL, a causa della struttura semplice e della mancanza di compressione: si tratta di un processo molto veloce e a condizione che l'integrità fisica dell'SQL il database non è danneggiato, viene eseguito il backup, ma la dimensione della copia coincide con quella reale della dimensione della sicurezza informatica nello stato espanso (non viene eseguita la compressione). A causa degli ulteriori vantaggi del sistema di backup MS SQL, è più consigliabile utilizzarlo (sono consentiti 3 tipi di backup: completo, differenziale, copia del registro delle transazioni; è possibile creare processi eseguiti regolarmente; una copia di backup e una copia di backup sistema vengono implementati rapidamente; è possibile prevedere la dimensione dello spazio su disco richiesto, ecc.). I punti principali per organizzare un backup dal punto di vista della sicurezza del sistema sono:

  • La necessità di scegliere una posizione di archiviazione per i backup in modo che non siano accessibili agli utenti.
  • La necessità di archiviare i backup a distanza fisica dal server MS SQL (in caso di catastrofi naturali, incendi, attacchi, ecc.)
  • La possibilità di concedere i diritti per avviare un backup a un utente che non ha accesso ai backup.

Per maggiori dettagli fare riferimento alla documentazione di MS SQL.

Crittografia dei dati

Per proteggere i dati da accessi non autorizzati vengono spesso utilizzati vari strumenti crittografici (sia software che hardware), ma la loro fattibilità dipende in gran parte dalla corretta applicazione e dalla sicurezza generale del sistema. Esamineremo la crittografia dei dati nelle varie fasi della trasmissione e archiviazione dei dati utilizzando i mezzi più comuni e i principali errori nella progettazione del sistema utilizzando strumenti crittografici.

Esistono diverse fasi principali del trattamento delle informazioni che possono essere protette:

  • Trasferimento di dati tra la parte client del sistema e il server delle applicazioni
  • Trasferimento di dati tra il server delle applicazioni e MS SQL Server
  • Dati archiviati su MS SQL Server (file di dati su disco fisico)
  • Crittografia dei dati archiviati nella sicurezza delle informazioni
  • Dati esterni (in relazione alla sicurezza delle informazioni)

Per i dati archiviati sul lato client e sul server dell'applicazione (impostazioni utente salvate, elenco di sicurezza delle informazioni, ecc.), la crittografia è giustificata solo in casi molto rari e pertanto non viene presa in considerazione in questa sede. Quando si utilizzano strumenti crittografici, non bisogna dimenticare che il loro utilizzo può ridurre significativamente le prestazioni del sistema nel suo insieme.

Informazioni generali sulla protezione crittografica delle connessioni di rete quando si utilizza il protocollo TCP/IP.

Senza sicurezza, tutte le connessioni di rete sono vulnerabili alla sorveglianza e all’accesso non autorizzati. Per proteggerli, puoi utilizzare la crittografia dei dati a livello di protocollo di rete. Per crittografare i dati trasmessi su una rete locale, vengono spesso utilizzati gli strumenti IPSec forniti dal sistema operativo.

Gli strumenti IPSec forniscono la crittografia dei dati trasmessi utilizzando gli algoritmi DES e 3DES, nonché la verifica dell'integrità utilizzando le funzioni hash MD5 o SHA1. IPSec può funzionare in due modalità: modalità trasporto e modalità tunnel. La modalità di trasporto è più adatta per proteggere le connessioni su una rete locale. La modalità tunnel può essere utilizzata per organizzare le connessioni VPN tra segmenti di rete separati o proteggere una connessione remota a una rete locale su canali dati aperti.

I principali vantaggi di questo approccio sono:

  • Possibilità di gestione centralizzata della sicurezza tramite strumenti Active Directory.
  • La possibilità di escludere connessioni non autorizzate al server delle applicazioni e al server MS SQL (ad esempio, è possibile proteggere dall'aggiunta non autorizzata di sicurezza delle informazioni sul server delle applicazioni).
  • Eliminazione dell'"ascolto" del traffico di rete.
  • Non è necessario modificare il comportamento dei programmi applicativi (in questo caso 1C).
  • La natura standard di tale soluzione.

Tuttavia, questo approccio presenta limiti e svantaggi:

  • IPSec non protegge i dati da interferenze e intercettazioni direttamente sui computer di origine e di destinazione.
  • La quantità di dati trasferiti sulla rete è leggermente maggiore rispetto a quando non si utilizza IPSec.
  • Quando si utilizza IPSec, il carico sul processore centrale è leggermente superiore.

Una descrizione dettagliata dell'implementazione degli strumenti IPSec va oltre lo scopo di questo articolo e richiede la comprensione dei principi di base del funzionamento del protocollo IP. Per configurare correttamente la sicurezza della connessione leggere la relativa documentazione.

Separatamente, è necessario menzionare diversi aspetti del contratto di licenza con 1C quando si organizzano le connessioni VPN. Il fatto è che, nonostante l'assenza di restrizioni tecniche, quando si collegano diversi segmenti di una rete locale o si accede da remoto a un singolo computer a una rete locale, di solito sono necessarie diverse forniture di base.

Crittografia dei dati durante il trasferimento tra la parte client del sistema e il server delle applicazioni.

Oltre alla crittografia a livello del protocollo di rete, è possibile crittografare i dati a livello del protocollo COM+, come menzionato nell'articolo "Regolamentazione dell'accesso degli utenti alla base informatica nella versione client-server" di ITS. Per implementarlo è necessario impostare il livello di autenticazione per le chiamate a “Packet Privacy” per l'applicazione 1CV8 in “Servizi componenti”. Quando impostato su questa modalità, il pacchetto viene autenticato e crittografato, inclusi i dati, l'identità e la firma del mittente.

Crittografia dei dati durante il trasferimento tra il server delle applicazioni e MS SQL Server

MS SQL Server fornisce i seguenti strumenti per la crittografia dei dati:

  • È possibile utilizzare Secure Sockets Layer (SSL) durante il trasferimento dei dati tra il server delle applicazioni e MS SQL Server.
  • Quando si utilizza la libreria di rete Multiprotocollo, la crittografia dei dati viene utilizzata a livello RPC. Si tratta di una crittografia potenzialmente più debole rispetto all'utilizzo di SSL.
  • Se viene utilizzato il protocollo di scambio Shared Memory (questo accade se il server delle applicazioni e MS SQL Server si trovano sullo stesso computer), la crittografia non viene in nessun caso utilizzata.

Per stabilire la necessità di crittografare tutti i dati trasmessi per uno specifico server MS SQL, è necessario utilizzare l'utilità "Server Network Utility". Eseguilo e nella scheda "Generale", seleziona la casella di controllo "Forza crittografia protocollo". Il metodo di crittografia viene selezionato in base a quello utilizzato dall'applicazione client (ovvero, il server delle applicazioni 1C). Per utilizzare SSL, è necessario configurare correttamente il servizio di certificazione sulla propria rete.

Per impostare la necessità di crittografare tutti i dati trasmessi per un server applicativo specifico, è necessario utilizzare l'utilità "Client Network Utility" (solitamente situata in "C:\WINNT\system32\cliconfg.exe"). Come nel caso precedente, nella scheda "Generale", seleziona la casella di controllo "Forza crittografia protocollo".

Vale la pena considerare che l'uso della crittografia in questo caso può avere un impatto significativo sulle prestazioni del sistema, soprattutto quando si utilizzano query che restituiscono grandi quantità di informazioni.

Per proteggere in modo più completo la connessione tra il server delle applicazioni e MS SQL Server quando si utilizza il protocollo TCP/IP, possiamo consigliare diverse modifiche alle impostazioni predefinite.

Innanzitutto è possibile impostare una porta diversa da quella standard (per impostazione predefinita viene utilizzata la porta 1433). Se decidi di utilizzare una porta TCP non standard per lo scambio dati, tieni presente che:

  • Il server MS SQL e il server delle applicazioni devono utilizzare la stessa porta.
  • Quando si utilizzano i firewall, questa porta deve essere consentita.
  • Non è possibile impostare una porta che possa essere utilizzata da altre applicazioni sul server MS SQL. Come riferimento, è possibile utilizzare http://www.ise.edu/in-notes/iana/assignments/port-numbers (indirizzo preso dalla documentazione online di SQL Server).
  • Quando si utilizzano più istanze del servizio MS SQL Server, assicurarsi di leggere la documentazione di MS SQL per la configurazione (sezione "Configurazione delle connessioni di rete").

In secondo luogo, nelle impostazioni del protocollo TCP/IP sul server MS SQL, è possibile impostare il flag "Nascondi server", che vieta le risposte alle richieste broadcast per questa istanza del servizio MS SQL Server.

Crittografia dei dati MS SQL archiviati su disco

Esiste una selezione abbastanza ampia di software e hardware per crittografare i dati situati su un disco locale (questo include la capacità standard di Windows di utilizzare EFS, l'uso di chiavi eToken e programmi di terze parti come Jetico Bestcrypt o PGPDisk). Uno dei compiti principali svolti da questi strumenti è proteggere i dati in caso di perdita del supporto (ad esempio, in caso di furto di un server). Vale soprattutto la pena notare che Microsoft sconsiglia di archiviare i database MS SQL su supporti crittografati, e questo è abbastanza giustificato. Il problema principale in questo caso è un calo significativo della produttività e possibili problemi affidabilità dai guasti. Il secondo fattore che complica la vita dell'amministratore di sistema è la necessità di garantire la disponibilità di tutti i file del database nel momento in cui il servizio MS SQL vi accede per la prima volta (vale a dire, è auspicabile che le azioni interattive siano escluse quando si collega un supporto crittografato).

Per evitare un notevole calo delle prestazioni del sistema, è possibile sfruttare la capacità di MS SQL di creare database in più file. Naturalmente, in questo caso, il database MS SQL non dovrebbe essere creato dal server 1C durante la creazione dell'infobase, ma dovrebbe essere creato separatamente. Di seguito è riportato un esempio di script TSQL con commenti:

USO maestro
ANDARE
-- Creare un database SomeData,
CREA DATABASE SomeData
-- i cui dati si trovano interamente nel filegroup PRIMARY.
SULLA PRIMARIA
-- Il file di dati principale si trova su un supporto crittografato (unità logica E:)
-- e ha una dimensione iniziale di 100 MB, può essere aumentata automaticamente a 200 MB con
-- con incrementi di 20 MB
(NOME = AlcuniDati1,
NOMEFILE = "E:\AlcuniDati1.mdf",
DIMENSIONE = 100 MB,
DIMENSIONE MASSIMA = 200,
CRESCITA FILE = 2),
-- Il secondo file di dati si trova su un supporto non crittografato (unità logica C:)
-- e ha una dimensione iniziale di 100 MB, può essere aumentata automaticamente fino al limite
-- spazio su disco con incrementi del 5% della dimensione del file corrente (arrotondato a 64 KB)
(NOME = AlcuniDati2,
FILENAME = "c:\programmi\microsoft sql server\mssql\data\SomeData2.ndf",
DIMENSIONE = 100 MB,
DIMENSIONE MASSIMA = ILLIMITATO,
CRESCITA FILE = 5%)
ACCEDERE
-- Sebbene il registro delle transazioni possa anche essere diviso in parti, ciò non dovrebbe essere fatto,
-- Perché questo file cambia molto più frequentemente e viene pulito regolarmente (ad esempio, quando
-- creazione di un backup del database).
(NOME = SomeDatalog,
FILENAME = "c:\programmi\microsoft sql server\mssql\data\SomeData.ldf",
DIMENSIONE = 10 MB,
DIMENSIONE MASSIMA = ILLIMITATO,
CRESCITA FILE = 10)
ANDARE
-- È meglio dare immediatamente la proprietà del database all'utente per conto di chi
-- 1C si connetterà. Per fare ciò, dobbiamo dichiarare la base corrente
- appena creato,
USA Alcuni dati
ANDARE
-- ed esegui sp_changedbowner
EXEC sp_changedbowner @loginame = "SomeData_dbowner"

Una breve digressione sulla crescita automatica della dimensione del file di dati. Per impostazione predefinita, le dimensioni dei file per i nuovi database vengono aumentate con incrementi del 10% rispetto alla dimensione del file corrente. Questa è una soluzione del tutto accettabile per i database di piccole dimensioni, ma non molto buona per quelli di grandi dimensioni: con una dimensione del database, ad esempio, di 20 GB, il file dovrebbe immediatamente aumentare di 2 GB. Anche se questo evento si verifica abbastanza raramente, può durare diverse decine di secondi (tutte le altre transazioni sono effettivamente inattive durante questo periodo), il che, se si verifica durante il lavoro attivo con il database, può causare alcuni errori. La seconda conseguenza negativa dell'incremento proporzionale, che si verifica quando lo spazio su disco è quasi completamente pieno, è la probabilità di un guasto prematuro dovuto allo spazio libero insufficiente. Ad esempio, se una partizione del disco con una capacità di 40 GB è completamente dedicata a un database (più precisamente, a un file di questo database), allora la dimensione critica del file del database alla quale è necessario urgentemente (molto urgentemente, al punto da interrompere il normale lavoro degli utenti) per riorganizzare l'archiviazione delle informazioni è un file di dati della dimensione di 35 GB. Con la dimensione di incremento impostata su 10-20 MB, puoi continuare a lavorare fino a raggiungere 39 GB.

Pertanto, sebbene l'elenco precedente specifichi un aumento della dimensione di uno dei file di database con incrementi del 5%, per database di grandi dimensioni è meglio impostare un incremento fisso di 10-20 MB. Quando si impostano i valori di incremento per l'aumento della dimensione dei file del database, è necessario tenere presente che finché uno dei file in un gruppo di file non raggiunge la sua dimensione massima, si applica la regola: i file in un gruppo di file vengono aumentati tutti contemporaneamente tempo, quando saranno tutti completamente riempiti. Pertanto, nell'esempio precedente, quando il file SomeData1.mdf raggiunge la dimensione massima di 200 MB, il file SomeData2.ndf avrà una dimensione di circa 1,1 GB.

Dopo aver creato un database di questo tipo, anche se i suoi file non protetti SomeData2.ndf e SomeData.ldf diventano accessibili a un utente malintenzionato, sarà estremamente difficile ripristinare il vero stato del database: i dati (comprese le informazioni sulla struttura logica del database ) saranno sparsi su diversi file e le informazioni chiave (su, ad esempio, quali file compongono questo database) si troveranno nel file crittografato.

Naturalmente, se si utilizza la memorizzazione dei file di database utilizzando mezzi crittografici, il backup (almeno di questi file) non dovrebbe essere eseguito su supporti non crittografati. Per eseguire il backup di singoli file di database, utilizzare la sintassi del comando BACKUP DATABASE appropriata. Tieni presente che sebbene sia possibile proteggere un backup del database con una password (le opzioni "PASSWORD = " e "MEDIAPASSWORD = " del comando "BACKUP DATABASE"), tale backup non viene crittografato!

Crittografia dei dati del client e del server delle applicazioni archiviati sui dischi

Nella maggior parte dei casi, non può essere considerato giustificato archiviare i file utilizzati da 1C:Enterprise (parte client e server applicazioni) su supporti crittografati a causa di costi irragionevolmente elevati, tuttavia, se tale necessità esiste, tenere presente che la parte server applicazioni e client dell'applicazione molto spesso creano file temporanei. Spesso questi file possono rimanere anche dopo che l'applicazione ha terminato l'esecuzione ed è quasi impossibile garantirne la rimozione utilizzando gli strumenti 1C. Pertanto, diventa necessario crittografare la directory utilizzata per i file temporanei in 1C o non memorizzarla su disco utilizzando un'unità RAM (quest'ultima opzione non è sempre possibile a causa della dimensione dei file generati e dei requisiti di RAM di 1C:Enterprise applicazione stessa).

Crittografia dei dati utilizzando strumenti 1C integrati.

Le funzionalità standard per l'utilizzo della crittografia in 1C si riducono all'utilizzo di oggetti per lavorare con file Zip con parametri di crittografia. Sono disponibili le seguenti modalità di crittografia: algoritmo AES con una chiave di 128, 192 o 256 bit e un algoritmo obsoleto originariamente utilizzato nell'archiviatore Zip. I file zip crittografati con AES non sono leggibili da molti archiviatori (WinRAR, 7zip). Per generare un file contenente dati crittografati, è necessario specificare una password e un algoritmo di crittografia. Di seguito è riportato l'esempio più semplice di funzioni di crittografia-decrittografia basate su questa funzionalità:

Funzione EncryptData (dati, password, metodo di crittografia = non definito) Esportazione

// Scrive i dati in un file temporaneo. In effetti, non tutti i dati possono essere salvati in questo modo.
ValoreInFile(NomeFileTemporaneo, Dati);

// Scrive dati temporanei nell'archivio
Zip = Nuovo ZipFileRecord (nome file archivio temporaneo, password, metodo di crittografia);
Zip.Add(NomeFileTemporaneo);
Zip.Scrivi();

// Legge i dati dall'archivio ricevuto in RAM
EncryptedData = NewValueStorage(NewBinaryData(ArchiveTemporaryFileName));

// File temporanei: elimina

Funzione EndFunctions DecryptData (dati crittografati, password) Esportazione

// Attenzione! La correttezza dei parametri passati non viene monitorata

// Scrive il valore passato in un file
ArchiveTemporaryFileName = GetTemporaryFileName("zip");
BinaryArchiveData = EncryptedData.Get();
BinaryArchiveData.Write(ArchiveTemporaryFileName);

// Estrae il primo file dell'archivio appena scritto
NomeFileTemporaneo = OttieniNomeFileTemporaneo();
Zip = Nuovo ReadZipFile (nome file archivio temporaneo, password);
Zip.Extract(Zip.Items, TemporaryFileName, ZIPFilePathRecoveryMode.Do NotRecover);

// Leggi il file scritto
Dati = ValoreDaFile(NomeFileTemporaneo + "\" + Zip.Elementi.Nome);

//Elimina i file temporanei
EliminaFile(NomeFileTemporaneo);
EliminaFile(ArchiveTemporaryFileName);

Dati di restituzione;

EndFunction

Naturalmente, questo metodo non può essere definito ideale: i dati vengono scritti in una cartella temporanea in chiaro, le prestazioni del metodo, francamente, sono peggiori che mai, l'archiviazione nel database richiede una quantità di spazio estremamente grande, ma questo è l'unico metodo che si basa solo sui meccanismi integrati della piattaforma. Inoltre, ha un vantaggio rispetto a molti altri metodi: questo metodo racchiude contemporaneamente i dati insieme alla crittografia. Se si desidera implementare la crittografia senza gli svantaggi di questo metodo, è necessario implementarli in un componente esterno oppure ricorrere alle librerie esistenti attraverso la creazione di oggetti COM, ad esempio utilizzando Microsoft CryptoAPI. Ad esempio, forniremo le funzioni di crittografia/decrittografia di una stringa in base alla password ricevuta.

Funzione EncryptStringDES(UnencryptedString, Password)

CAPICOM_ENCRYPTION_ALGORITHM_DES = 2; // Questa costante proviene da CryptoAPI


EncryptionMechanism.Content = UnencryptedString;
Motore di crittografia.Algorithm.Name = CAPICOM_ENCRYPTION_ALGORITHM_DES;
EncryptedString = EncryptionMechanism.Encrypt();

restituire EncryptedString;

EndFunction // EncryptStringDES()

Funzione DecryptStringDES(EncryptedString, Password)

//Attenzione! I parametri non vengono controllati!

Motore di crittografia = Nuovo COMObject("CAPICOM.EncryptedData");
EncryptionMechanism.SetSecret(Password);
Tentativo
EncryptionMechanism.Decrypt(EncryptedString);
Eccezione
// Password errata!;
Restituisce Non definito;
Finetentativo;

ReturnEncryptionMechanism.Content;

EndFunction // DecryptStringDES()

Tieni presente che durante il trasferimento valore vuoto l'immissione di una stringa o di una password in queste funzioni genererà un messaggio di errore. La stringa ottenuta utilizzando questa procedura di crittografia è leggermente più lunga dell'originale. La specificità di questa crittografia è che se si crittografa una stringa due volte, le stringhe risultanti NON saranno identiche.

Errori di base quando si utilizzano strumenti crittografici.

Quando si utilizzano strumenti crittografici, spesso si commettono gli stessi errori:

Sottovalutare la penalità prestazionale quando si utilizza la crittografia.

La crittografia è un compito che richiede un numero piuttosto elevato di calcoli (soprattutto per algoritmi come DES, 3DES, GOST, PGP). E anche quando si utilizzano algoritmi ottimizzati e ad alte prestazioni (RC5, RC6, AES), non c'è scampo dal trasferimento di dati non necessario nella memoria e dall'elaborazione computazionale. E questo quasi annulla le capacità di molti componenti del server (array RAID, adattatori di rete). Quando si utilizza la crittografia hardware o la derivazione hardware della chiave di crittografia, esiste un ulteriore possibile collo di bottiglia delle prestazioni: la velocità di trasferimento dei dati tra il dispositivo aggiuntivo e la memoria (dove le prestazioni di tale dispositivo potrebbero non essere critiche). Quando si utilizza la crittografia di piccole quantità di dati (ad esempio un messaggio di posta elettronica), l'aumento del carico di elaborazione sul sistema non è così evidente, ma nel caso della crittografia totale di tutto ciò può influire notevolmente sulle prestazioni del sistema nel complesso.

Sottostima delle moderne capacità di selezione di password e chiavi.

Al momento, le capacità della tecnologia sono tali che una chiave con una lunghezza di 40-48 bit può essere selezionata da una piccola organizzazione e una chiave con una lunghezza di 56-64 bit da una grande organizzazione. Quelli. devono essere utilizzati algoritmi che utilizzano una chiave di almeno 96 o 128 bit. Ma la maggior parte delle chiavi viene generata utilizzando algoritmi hash (SHA-1, ecc.) basati sulle password immesse dall'utente. In questo caso, una chiave con una lunghezza di 1024 bit potrebbe non essere d'aiuto. Innanzitutto, viene spesso utilizzata una password facile da indovinare. I fattori che facilitano la selezione sono: utilizzare un solo caso di lettere; uso di parole, nomi ed espressioni nelle password; utilizzo di date conosciute, compleanni, ecc.; utilizzare "modelli" durante la generazione delle password (ad esempio, 3 lettere, quindi 2 numeri, quindi 3 lettere in tutta l'organizzazione). Una buona password dovrebbe essere una sequenza abbastanza casuale di lettere maiuscole, numeri e segni di punteggiatura. Le password inserite da tastiera lunghe fino a 7-8 caratteri, anche se si seguono queste regole, possono essere indovinate in un tempo ragionevole, quindi è meglio che la password sia almeno di 11-13 caratteri. La soluzione ideale è evitare di generare una chiave tramite password, ad esempio utilizzando varie smart card, ecc., ma in questo caso è necessario prevedere la possibilità di proteggere dalla perdita del supporto della chiave di crittografia.

Archiviazione non sicura di chiavi e password.

Esempi comuni di questo errore sono:

  • password lunghe e complesse scritte su foglietti adesivi incollati sul monitor dell'utente.
  • memorizzare tutte le password in un file non protetto (o protetto in modo molto più debole del sistema stesso)
  • conservazione delle chiavi elettroniche in pubblico dominio.
  • trasferimento frequente di chiavi elettroniche tra utenti.

Perché realizzare una porta blindata se la chiave è sotto lo zerbino?

Trasferimento di dati inizialmente crittografati in un ambiente non sicuro.

Quando imposti un sistema di sicurezza, assicurati che faccia il suo lavoro. Ad esempio, mi sono imbattuto in una situazione (non correlata a 1C) in cui un file inizialmente crittografato, quando il programma era in esecuzione in chiaro, veniva inserito in una cartella temporanea da dove poteva essere letto in sicurezza. Spesso le copie di backup dei dati crittografati in forma chiara si trovano da qualche parte “non lontano” da questi dati.

Utilizzo di strumenti crittografici per altri scopi

Crittografando i dati in transito, non puoi aspettarti che i dati siano inaccessibili nel luogo in cui vengono utilizzati. Ad esempio, i servizi IPSec non impediscono in alcun modo al server delle applicazioni di "sniffare" il traffico di rete a livello di applicazione.

Pertanto, per evitare errori durante l'implementazione dei sistemi crittografici, dovresti (come minimo) fare quanto segue prima di distribuirlo.

  • Scoprire:
    • Cosa deve essere protetto?
    • Quale metodo di protezione dovresti usare?
    • Quali parti del sistema devono essere protette?
    • Chi controllerà gli accessi?
    • La crittografia funzionerà in tutte le aree giuste?
  • Determinare dove sono archiviate le informazioni, come verranno inviate in rete e i computer da cui si accederà alle informazioni. Ciò fornirà informazioni sulla velocità, la capacità e l'utilizzo della rete prima di implementare il sistema, utile per ottimizzare le prestazioni.
  • Valutare la vulnerabilità del sistema a vari tipi di attacchi.
  • Sviluppare e documentare un piano di sicurezza del sistema.
  • Valutare l’efficienza economica (giustificazione) dell’utilizzo del sistema.

Conclusione

Naturalmente, in una rapida rassegna è impossibile indicare tutti gli aspetti legati alla sicurezza in 1C, ma permettiamoci di trarre alcune conclusioni preliminari. Naturalmente, questa piattaforma non può essere definita ideale: come molte altre, ha i suoi problemi nell'organizzazione di un sistema sicuro. Ma ciò non significa in alcun modo che questi problemi non possano essere aggirati; al contrario, quasi tutte le carenze possono essere eliminate con uno sviluppo, un’implementazione e un utilizzo adeguati del sistema. La maggior parte dei problemi sorgono a causa dello sviluppo insufficiente di una soluzione applicativa specifica e del suo ambiente di esecuzione. Ad esempio, le soluzioni standard senza modifiche significative semplicemente non implicano la creazione di un sistema sufficientemente sicuro.

Questo articolo dimostra ancora una volta che qualsiasi insieme di misure di sicurezza deve coprire tutte le fasi di implementazione: sviluppo, distribuzione, amministrazione del sistema e, ovviamente, misure organizzative. Nei sistemi informativi è il “fattore umano” (compresi gli utenti) la principale minaccia alla sicurezza. Questo insieme di misure deve essere ragionevole ed equilibrato: non ha senso ed è improbabile che vengano stanziati fondi sufficienti per organizzare una protezione che superi il costo dei dati stessi.

Azienda è un servizio unico per acquirenti, sviluppatori, rivenditori e partner affiliati. Inoltre, questo è uno dei migliori negozi di software online in Russia, Ucraina e Kazakistan, che offre ai clienti una vasta gamma di prodotti, molti metodi di pagamento, elaborazione rapida (spesso istantanea) degli ordini e monitoraggio del processo di ordine in una sezione personale .