Nous avons été piratés !!!
Nous avons découvert que quelqu’un a manipulé nos politiques de sécurité, mais nous ne semblons pas pouvoir savoir qui. On nous a demandé d’enquêter sur qui a modifié nos politiques d’accès aux lignes.
Les politiques n’ont pas été modifiées depuis longtemps, mais nous avons des raisons de croire que cela remonte à plus de 2 semaines. Le problème est que nous ne pouvons pas utiliser l’onglet Historique des requêtes, car il ne conserve que 14 jours d’historique.
Nous sommes vraiment dans l’embarras et nous devons absolument découvrir qui a modifié notre politique !
Pour configurer rapidement ce test, exécutez ce qui suit. Nous avons évité d’utiliser un véritable utilisateur en raison du niveau d’accès dont cet utilisateur aurait besoin. Dans ce cas, vous enquêtez sur vous-même :
Données factices
create table MOCK_DATA (
id INT,
salary INT,
teamnumber INT
);
insert into MOCK_DATA (id, salary, teamnumber) values (1, 781767, 2);
insert into MOCK_DATA (id, salary, teamnumber) values (2, 701047, 5);
insert into MOCK_DATA (id, salary, teamnumber) values (3, 348497, 2);
insert into MOCK_DATA (id, salary, teamnumber) values (4, 555275, 2);
insert into MOCK_DATA (id, salary, teamnumber) values (5, 144962, 3);
insert into MOCK_DATA (id, salary, teamnumber) values (6, 832979, 4);
insert into MOCK_DATA (id, salary, teamnumber) values (7, 387404, 1);
insert into MOCK_DATA (id, salary, teamnumber) values (8, 427563, 3);
insert into MOCK_DATA (id, salary, teamnumber) values (9, 788928, 3);
insert into MOCK_DATA (id, salary, teamnumber) values (10, 257613, 1);
insert into MOCK_DATA (id, salary, teamnumber) values (11, 483792, 4);
insert into MOCK_DATA (id, salary, teamnumber) values (12, 720679, 3);
insert into MOCK_DATA (id, salary, teamnumber) values (13, 452976, 4);
insert into MOCK_DATA (id, salary, teamnumber) values (14, 541193, 2);
insert into MOCK_DATA (id, salary, teamnumber) values (15, 159377, 1);
insert into MOCK_DATA (id, salary, teamnumber) values (16, 825003, 4);
insert into MOCK_DATA (id, salary, teamnumber) values (17, 362209, 3);
insert into MOCK_DATA (id, salary, teamnumber) values (18, 291622, 5);
insert into MOCK_DATA (id, salary, teamnumber) values (19, 646774, 3);
insert into MOCK_DATA (id, salary, teamnumber) values (20, 971930, 1);
CREATE OR REPLACE ROW ACCESS POLICY demo_policy
AS (teamnumber int) RETURNS BOOLEAN ->
CURRENT_ROLE() = 'HR'
OR LEFT(CURRENT_ROLE(),13) = 'MANAGER_TEAM_' AND RIGHT(CURRENT_ROLE(),1) = RIGHT(teamnumber, 1);
alter table MOCK_DATA add row access policy demo_policy on (teamnumber);
« Le piratage »
CREATE OR REPLACE PROCEDURE totally_not_a_suspicious_procedure()
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
var stmt = snowflake.createStatement({
sqlText: "alter table MOCK_DATA drop row access policy demo_policy;"
});
stmt.execute();
return "Row access policy dropped successfully.";
$$;
CALL totally_not_a_suspicious_procedure()
select * from MOCK_DATA;
CREATE OR REPLACE PROCEDURE totally_not_a_suspicious_procedure2()
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
var stmt = snowflake.createStatement({
sqlText: "alter table MOCK_DATA add row access policy demo_policy on (teamnumber);;"
});
stmt.execute();
return "Row access policy dropped successfully.";
$$;
CALL totally_not_a_suspicious_procedure2();
drop totally_not_a_suspicious_procedure();
drop totally_not_a_suspicious_procedure2();
Le pirate pense être intelligent en appelant une procédure au lieu de la commande SQL directe parce qu’il suppose que seule l’appel CALL procedure sera affiché. Il vous revient d’écrire les commandes pour découvrir qui a accédé aux tables ou aux politiques !
N’oubliez pas que vous ne pouvez pas utiliser l’onglet Historique des requêtes car cela aurait dû se produire « il y a plus de 14 jours ».
Laisser un commentaire
Vous devez vous connecter pour publier un commentaire.