Come gestire o impedire che tutti gli amministratori e gli utenti vengano rimossi

2

Ho un sito web che memorizza tutti gli utenti in un database. Un utente può accedere al sito Web e se dispone di privilegi sufficienti può aggiungere / eliminare utenti, nonché modificare i propri privilegi.

Come faccio a garantire che ci sia sempre almeno un amministratore (per creare / modificare / eliminare utenti) nel sistema o che un amministratore possa essere facilmente aggiunto al sistema.

Sicuramente posso mettere le regole in atto in modo che l'amministratore non possa cancellare se stesso, o altre regole del genere. Ma cosa succede se qualcuno cancella tutti gli utenti nella tabella SQL. Le password vengono sottoposte a hash, quindi non è come se il DBA potesse entrare e aggiungere un nuovo utente con diritti di amministratore.

Ho hardcode qualche nome utente / password speciale che viene automaticamente aggiunto al sistema se non esiste un amministratore?

    
posta TruthOf42 02.04.2014 - 20:54
fonte

5 risposte

1

Piuttosto che concentrarsi su come evitare che le persone aggirino il sistema, mi concentrerei sul fornire agli utenti un modo per raddrizzare la nave. In questo caso è semplice come un'applicazione a riga di comando che consente di creare un utente amministratore in un pizzico?

    
risposta data 02.04.2014 - 23:05
fonte
7

Quindi ti stai chiedendo come impedire a un utente della tua Applicazione di eliminare tutti gli utenti dell'applicazione , che sono memorizzati nel tuo database su un semplice Users tabella?

Implementa esattamente la stessa strategia che useresti per qualsiasi altro requisito di forma dei dati. Supponendo che tu non abbia un framework in grado di farlo meglio, potresti aggiungere un vincolo di intero tavolo su Users per richiedere che ci sia almeno un utente amministratore, come segue:

ALTER TABLE Users
ADD CONSTRAINT Chk_MinOneAdminUser 
CHECK (SELECT SUM(Users) WHERE Type = 'Admin') > 0

(Supponendo che si stia utilizzando SQL Server, non mischiare più app nello stesso database, non avere problemi di replica di cui preoccuparsi, può sopportare il colpo di prestazioni di una selezione aggiuntiva su tutti gli utenti per ciascun aggiornamento di tabella, e non riesco a pensare a qualcosa di meglio.)

    
risposta data 02.04.2014 - 22:38
fonte
2

what if someone deletes all the users in the SQL table. The passwords are hashed so it's not as if the DBA can just go in and add a new user with Admin rights.

Bene, se qualcuno cancella tutti gli utenti nella tabella SQL, si carica un backup? Perché stanno facendo queste cose!?

Ci sono vari modi per recuperare un account amministratore:

  1. Crea un utente normale, quindi connettiti direttamente al DB e contrassegnali come amministratore.
  2. Esegui manualmente gli SP che vengono eseguiti quando viene creato un amministratore.
  3. Crea una pagina speciale (o versione speciale delle pagine di amministrazione) che può essere eseguita senza privilegi di amministratore (IP limitato, firewall, ecc.), accedi e usali per creare un amministratore.

Queste diverse strategie hanno molte cose in comune:

  1. Richiedono che tu sia un amministratore del server o un amministratore del database.
  2. Sono pericolosi e hacky. Non vorrai tenerli attivi e dovrai assicurarti che gli utenti normali non possano attivarli. Tutte queste funzionalità dovrebbero essere cancellate (non semplicemente disattivate) per impostazione predefinita.
  3. Ignorano l'autenticazione, ma altrimenti sfruttano il codice esistente.
  4. Non è necessario codificarli finché il problema non si verifica effettivamente (e in effetti, non dovrebbe farlo, gli hack non mantenuti tendono a diventare obsoleti rapidamente).
risposta data 02.04.2014 - 21:08
fonte
2

Ho solo una regola per cui un utente amministratore non può autodenominarsi amministratore. Quindi, se Joe e Sue sono amministratori, Sue può rendere Joe un utente normale, ma poi rimane ancora e non può rendersi non un amministratore. Allo stesso modo un amministratore non può cancellare o disabilitare il proprio account.

Ora se l'ultimo amministratore dimentica la password, questo è un problema.

    
risposta data 02.04.2014 - 22:31
fonte
0
  1. Qualcuno cancella tutti gli utenti direttamente dal DB . Puoi semplicemente verificare se l'amministratore dedicato / almeno un è disponibile all'avvio dell'applicazione:

    using System.Linq;
    using Dapper;
    
    public interface IAppDbInitializer {
        void Seed();
    }
    
    protected void Application_Start() {
        this.SeedApplicationDatabase();
    }
    
    public class AppDbInitializer : IAppDbInitializer {
    
        private IAppDbConnectionFactory appDbConnectionFactory;
        private IPasswordHasher passwordHasher;
    
        public AppDbInitializer(IAppDbConnectionFactory appDbConnectionFactory, IPasswordHasher passwordHasher) {
            this.appDbConnectionFactory = appDbConnectionFactory;
            this.passwordHasher = passwordHasher;
        }
    
        public void Seed() {
            this.CreateUser(username: "Admin");
            this.CreateUser(username: "User");
        }
    
        private void CreateUser(string username) {
    
            using(var dbConnection = this.appDbConnectionFactory.CreateConnection()) {
    
                dbConnection.Open();
    
                var entry = dbConnection.Query(
                    sql: "SELECT TOP 1 1 FROM Users WHERE Username = @Username", 
                    param: new { Username = username }
                ).SingleOrDefault();
    
                if(entry == null) {
    
                    var affectedRows = dbConnection.Execute(
                        sql: "INSERT INTO Users (Username, [Password]) SELECT @Username, @Password", 
                        param: new {
                            Username = username,
                            Password = this.passwordHasher.CreateHash(username)
                        }
                    );
    
                    if(affectedRows == 0) {
                         throw new System.Exception("No rows affected");
                    }
    
                }
    
            }
    
        }
    
    }
    
    private void SeedApplicationDatabase() { 
        DependencyResolver.Current.GetService<IAppDbInitializer>().Seed();
    }
    
  2. Perché non aggiungere regole all'applicazione in modo che l'amministratore non possa essere cancellato?

risposta data 29.11.2016 - 10:19
fonte

Leggi altre domande sui tag