Keepass improve

From Essential
Revision as of 11:04, 27 February 2022 by Tcepo (talk | contribs) (→‎Source CPP)
Jump to navigation Jump to search

Ce document décrit la mise en place d'un gestionnaire de mots de passes crypté et sécurisé par contrôle d'accès.

Prérequis

Configuration d'Active Directory

  • un compte "ServiceKeepass" de type utilisateur restreint
  • un groupe <UserGroup> en lecture seule sur les mots de passes
  • un groupe <ManagerGroup> de gestion des mots de passes

Attention!: le groupe <AdminGroup> qui va gérer les mots de passes ne doit pas contenir des personnes que l'on veut limiter en lecture seule (* optionnel: un groupe d'administration de l'outil Attention!: le groupe qui va administrer l'outil ne doit pas contenir de personnes non autorisés à modifier l'outil)

Autre

  • un partage SMB au moins ouvert aux groupes qui vont accéder à l'outil
  • KeePass 2 dernière version portable
  • plugin KeeAutoExec.plgx pour ouvrir plusieurs bases simultanément

Plateforme de dévellopement

  • un pc sécurisé (préco:crypté et hors réseau)
  • KeePass 2.x déjà installé dans le pc sécurisé
  • compilateur win32 dans le pc sécurisé (préco: Microsoft Visual CPP)

Actions sur la plateforme de dev

Variables à définir

  • Pour chaque groupe définir le triplet:
 - GroupName:AccessType:Password
   - GroupName = Nom du groupe dans l'AD
   - AccessType = "users" pour lecture seulement des mots de passes ou "managers" pour la gestion en écriture aussi
   - Password = Mot de passe d'accès à l'outil
  • Définir ServicePassword = le mot de passe du compte ServiceKeepass

Actions

  • créer un répertoire keepass\bases
  • créer un répertoire keepass\keys
  • créer un répertoire keepass\start
  • créer un répertoire keepass\appli\users
  • copier les fichiers du "KeePass portable" dans le répertoire
  • ajouter le plugin KeeAutoExec.plgx
  • dupliquer keepass\appli\users vers keepass\appli\managers
  - ou créer des liens physiques sauf pour le fichier de configuration KeePass.config.xml qui doit être dupliqué obligatoirement!
  • Modifier la politique de sécurité dans le fichier keepass\appli\users\KeePass.config.xml:
		<Policy>
			<Plugins>true</Plugins>
			<Export>false</Export>
			<ExportNoKey>false</ExportNoKey>
			<Import>false</Import>
			<Print>false</Print>
			<NewFile>false</NewFile>
			<SaveFile>false</SaveFile>
			<AutoType>true</AutoType>
			<AutoTypeWithoutContext>true</AutoTypeWithoutContext>
			<CopyToClipboard>true</CopyToClipboard>
			<CopyWholeEntries>false</CopyWholeEntries>
			<DragDrop>true</DragDrop>
			<UnhidePasswords>true</UnhidePasswords>
			<ChangeMasterKey>false</ChangeMasterKey>
			<ChangeMasterKeyNoKey>false</ChangeMasterKeyNoKey>
			<EditTriggers>true</EditTriggers>
		</Policy>
  • Modifier le champs CheckForUpdate s'il existe dans les 2 fichiers KeePass.config.xml:
		<Start>
			<CheckForUpdate>false</CheckForUpdate>
			<CheckForUpdateConfigured>true</CheckForUpdateConfigured>
		</Start>

Création des bases

  • lancer KeePass
  • pour chaque groupe:
 - créer une nouvelle base nommée GroupName
 - créer une clé et la nommer comme cette base
 - entrer le mot de passe d'accès défini pour ce groupe
 - configurer le plugin KeeAutoExec.plgx pour intégrer d'autres bases

Création des lanceurs

  • pour chaque base créée
 - créer un fichier <GroupName>.cpp avec le source CPP fourni ci-joint
 - éditer
 - compiler
  • déplacer les fichiers <GroupName>.exe dans keepass\start

Configuration des droits

  • keepass\appli |autoriser ServiceKeepass en lecture et exécution et refuser le reste|autoriser le goupe administrateur de l'outil en modification
  • keepass\bases |autoriser ServiceKeepass en modification et refuser le reste|autoriser le goupe administrateur de l'outil en modification
  • keepass\keys |autoriser le goupe administrateur de l'outil en modification
  • keepass\keys et sous répertoires |autoriser ServiceKeepass à traverser le répertoire et refuser le reste
  • keepass\keys fichiers |autoriser ServiceKeepass à lire et refuser le reste
  • keepass\start |autoriser le goupe administrateur en modification
  • keepass\start et sous répertoire |autoriser le groupe utilisateurs en lecture et refuser le reste|autoriser les groupes managers keepass en lecture et refuser le reste
  • Pour chaque fichier <GroupName>.exe |ajouter le groupe <GroupName> associé en exécution et refuser le reste

Finalisation

  • Créer les raccourcis du ou des lanceurs associés au poste sur le bureau et dans le menu démarrer

Propositions/Options

  • préco: ajouter le decryptage dans les sources et utiliser un mot de passe crypté
  • préco: prévoir un mécanisme de redondance spaciale avec un pc portable en local et crypté
  • préco: la modification des clés et mots de passes d'accès aux bases ne doit être possible que par deux personnes en même temps (de confiances et sans conflits d'intérêts!)
  • préco: prévoir un backup régulier des bases
  • préco: prévoir ajout des clés avec compte ServiceKeepass

Source CPP

// Version history:
// 2013-05-26 Antonio DA SILVA PACHECO (ynotopec@gmail.com)
//   Modification from static directory to dynamic
//   Defines added

// Change these parameters
#define GroupName			L"users"	// User name or group name for this database
#define AccessType			L"managers"						// L"managers" for manage the database or L"users" for read only
#define ServicePassword	L"*"							// Show ESS_Supervision_Encadrement database. Do not archive with password!

// Not necessary to change
#define ServiceName	L"ServiceKeepass"		// default=L"ServiceKeepass"
#define DOMAIN			L"<domain>"	// default=L"<domain>", L"." to use local account database only

#define ROOT_DEPTH		L".."									// default=L".." // Keepass root directory relative to start directory
#define APPLI			L"appli\\" AccessType L"\\KeePass.exe"	// default=L"appli\\" AccessType L"\\KeePass.exe"
#define DB				L"bases\\" GroupName L".kdbx"			// default=L"bases\\" DB_NAME L".kdbx"
#define KEY				L"keys\\" GroupName L".key"				// default=L"keys\\" DB_NAME L".key"
#define COMMAND_LINE	APPLI L" " DB L" -preselect:" KEY		// default=APPLI L" " DB L" -preselect:" KEY

#include <direct.h>
#include <windows.h>
#include <stdio.h> 
#include <ntsecapi.h>

int main()
{
// Store root directory
_wchdir(ROOT_DEPTH);
wchar_t RootPath[_MAX_PATH];
_wgetcwd(RootPath, _MAX_PATH);

// Launch application with another account
STARTUPINFOW su_info;
ZeroMemory(&su_info, sizeof(STARTUPINFOW));
su_info.cb = sizeof(STARTUPINFOW);

PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
CreateProcessWithLogonW(ServiceName, DOMAIN, ServicePassword, LOGON_WITH_PROFILE, NULL, COMMAND_LINE, 0, NULL, RootPath, &su_info, &pi);
return 0;
}

//ref http://forums.codeguru.com/showthread.php?493062-c-createProcessWithLogonW

Exemple de fichiers *.config.xml

Users

<?xml version="1.0" encoding="utf-8"?>
<Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
	<Meta>
		<PreferUserConfiguration>false</PreferUserConfiguration>
		<OmitItemsWithDefaultValues>true</OmitItemsWithDefaultValues>
	</Meta>
	<Application>
		<LastUsedFile>
			<Path></Path>
			<CredProtMode>Obf</CredProtMode>
			<CredSaveMode>NoSave</CredSaveMode>
		</LastUsedFile>
		<MostRecentlyUsed>
			<MaxItemCount>12</MaxItemCount>
			<Items>
				<ConnectionInfo>
					<Path></Path>
					<CredProtMode>Obf</CredProtMode>
					<CredSaveMode>NoSave</CredSaveMode>
				</ConnectionInfo>
			</Items>
		</MostRecentlyUsed>
		<WorkingDirectories />
		<Start>
			<CheckForUpdate>false</CheckForUpdate>
			<CheckForUpdateConfigured>true</CheckForUpdateConfigured>
		</Start>
		<FileOpening />
		<FileClosing />
		<TriggerSystem>
			<Triggers />
		</TriggerSystem>
	</Application>
	<Logging />
	<MainWindow>
		<X>259</X>
		<Y>45</Y>
		<Width>662</Width>
		<Height>513</Height>
		<Maximized>true</Maximized>
		<SplitterHorizontalFrac>0.8303835</SplitterHorizontalFrac>
		<SplitterVerticalFrac>0.250366032</SplitterVerticalFrac>
		<Layout>Default</Layout>
		<MinimizeAfterLocking>false</MinimizeAfterLocking>
		<ToolBar />
		<EntryView />
		<TanView />
		<EntryListColumnCollection>
			<Column>
				<Type>Title</Type>
				<Width>348</Width>
			</Column>
			<Column>
				<Type>UserName</Type>
				<Width>237</Width>
			</Column>
			<Column>
				<Type>Password</Type>
				<Width>120</Width>
				<HideWithAsterisks>true</HideWithAsterisks>
			</Column>
			<Column>
				<Type>Url</Type>
				<Width>90</Width>
			</Column>
			<Column>
				<Type>Notes</Type>
				<Width>90</Width>
			</Column>
		</EntryListColumnCollection>
		<EntryListColumnDisplayOrder>0 1 2 3 4</EntryListColumnDisplayOrder>
		<ListSorting>
			<Order>Ascending</Order>
		</ListSorting>
	</MainWindow>
	<UI>
		<TrayIcon />
		<Hiding />
		<StandardFont>
			<Family>Microsoft Sans Serif</Family>
			<Size>8.25</Size>
			<GraphicsUnit>Point</GraphicsUnit>
			<Style>Regular</Style>
			<OverrideUIDefault>false</OverrideUIDefault>
		</StandardFont>
		<PasswordFont>
			<Family>Courier New</Family>
			<Size>8.25</Size>
			<GraphicsUnit>Point</GraphicsUnit>
			<Style>Regular</Style>
			<OverrideUIDefault>false</OverrideUIDefault>
		</PasswordFont>
		<BannerStyle>WinVistaBlack</BannerStyle>
		<DataEditorFont>
			<Family>Microsoft Sans Serif</Family>
			<Size>8.25</Size>
			<GraphicsUnit>Point</GraphicsUnit>
			<Style>Regular</Style>
			<OverrideUIDefault>false</OverrideUIDefault>
		</DataEditorFont>
		<UIFlags>0</UIFlags>
		<KeyCreationFlags>0</KeyCreationFlags>
		<KeyPromptFlags>0</KeyPromptFlags>
	</UI>
	<Security>
		<WorkspaceLocking>
			<LockAfterTime>0</LockAfterTime>
			<LockAfterGlobalTime>0</LockAfterGlobalTime>
		</WorkspaceLocking>
		<Policy>
			<Export>false</Export>
			<ExportNoKey>false</ExportNoKey>
			<Import>false</Import>
			<Print>false</Print>
			<NewFile>false</NewFile>
			<SaveFile>false</SaveFile>
			<CopyWholeEntries>false</CopyWholeEntries>
			<ChangeMasterKey>false</ChangeMasterKey>
			<ChangeMasterKeyNoKey>false</ChangeMasterKeyNoKey>
		</Policy>
		<MasterPassword>
			<MinimumLength>0</MinimumLength>
			<MinimumQuality>0</MinimumQuality>
		</MasterPassword>
	</Security>
	<Native />
	<PasswordGenerator>
		<AutoGeneratedPasswordsProfile>
			<GeneratorType>CharSet</GeneratorType>
			<Length>20</Length>
			<CharSetRanges>ULD_______</CharSetRanges>
		</AutoGeneratedPasswordsProfile>
		<LastUsedProfile>
			<GeneratorType>CharSet</GeneratorType>
			<Length>20</Length>
			<CharSetRanges>ULD_______</CharSetRanges>
		</LastUsedProfile>
		<UserProfiles />
	</PasswordGenerator>
	<Defaults>
		<OptionsTabIndex>1</OptionsTabIndex>
		<SearchParameters>
			<ComparisonMode>InvariantCultureIgnoreCase</ComparisonMode>
		</SearchParameters>
		<KeySources>
			<Association>
				<DatabasePath></DatabasePath>
				<KeyFilePath></KeyFilePath>
			</Association>
		</KeySources>
	</Defaults>
	<Integration>
		<HotKeyGlobalAutoType>393281</HotKeyGlobalAutoType>
		<HotKeySelectedAutoType>0</HotKeySelectedAutoType>
		<HotKeyShowWindow>393291</HotKeyShowWindow>
		<HotKeyEntryMenu>1</HotKeyEntryMenu>
		<UrlSchemeOverrides>
			<BuiltInOverridesEnabled>1</BuiltInOverridesEnabled>
			<CustomOverrides />
		</UrlSchemeOverrides>
		<ProxyType>System</ProxyType>
	</Integration>
	<Custom />
</Configuration>

Manager

<?xml version="1.0" encoding="utf-8"?>
<Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
	<Meta>
		<PreferUserConfiguration>false</PreferUserConfiguration>
		<OmitItemsWithDefaultValues>true</OmitItemsWithDefaultValues>
	</Meta>
	<Application>
		<LastUsedFile>
			<Path>..\..\bases\ESS.kdbx</Path>
			<CredProtMode>Obf</CredProtMode>
			<CredSaveMode>NoSave</CredSaveMode>
		</LastUsedFile>
		<MostRecentlyUsed>
			<MaxItemCount>12</MaxItemCount>
			<Items>
				<ConnectionInfo>
					<Path></Path>
					<CredProtMode>Obf</CredProtMode>
					<CredSaveMode>NoSave</CredSaveMode>
				</ConnectionInfo>
			</Items>
		</MostRecentlyUsed>
		<WorkingDirectories />
		<Start>
			<CheckForUpdate>false</CheckForUpdate>
			<CheckForUpdateConfigured>true</CheckForUpdateConfigured>
		</Start>
		<FileOpening />
		<FileClosing />
		<TriggerSystem>
			<Triggers />
		</TriggerSystem>
	</Application>
	<Logging />
	<MainWindow>
		<X>259</X>
		<Y>45</Y>
		<Width>662</Width>
		<Height>513</Height>
		<Maximized>true</Maximized>
		<SplitterHorizontalFrac>0.8303835</SplitterHorizontalFrac>
		<SplitterVerticalFrac>0.250366032</SplitterVerticalFrac>
		<Layout>Default</Layout>
		<MinimizeAfterLocking>false</MinimizeAfterLocking>
		<ToolBar />
		<EntryView />
		<TanView />
		<EntryListColumnCollection>
			<Column>
				<Type>Title</Type>
				<Width>348</Width>
			</Column>
			<Column>
				<Type>UserName</Type>
				<Width>237</Width>
			</Column>
			<Column>
				<Type>Password</Type>
				<Width>120</Width>
				<HideWithAsterisks>true</HideWithAsterisks>
			</Column>
			<Column>
				<Type>Url</Type>
				<Width>90</Width>
			</Column>
			<Column>
				<Type>Notes</Type>
				<Width>90</Width>
			</Column>
		</EntryListColumnCollection>
		<EntryListColumnDisplayOrder>0 1 2 3 4</EntryListColumnDisplayOrder>
		<ListSorting>
			<Order>Ascending</Order>
		</ListSorting>
	</MainWindow>
	<UI>
		<TrayIcon />
		<Hiding />
		<StandardFont>
			<Family>Microsoft Sans Serif</Family>
			<Size>8.25</Size>
			<GraphicsUnit>Point</GraphicsUnit>
			<Style>Regular</Style>
			<OverrideUIDefault>false</OverrideUIDefault>
		</StandardFont>
		<PasswordFont>
			<Family>Courier New</Family>
			<Size>8.25</Size>
			<GraphicsUnit>Point</GraphicsUnit>
			<Style>Regular</Style>
			<OverrideUIDefault>false</OverrideUIDefault>
		</PasswordFont>
		<BannerStyle>WinVistaBlack</BannerStyle>
		<DataEditorFont>
			<Family>Microsoft Sans Serif</Family>
			<Size>8.25</Size>
			<GraphicsUnit>Point</GraphicsUnit>
			<Style>Regular</Style>
			<OverrideUIDefault>false</OverrideUIDefault>
		</DataEditorFont>
		<UIFlags>0</UIFlags>
		<KeyCreationFlags>0</KeyCreationFlags>
		<KeyPromptFlags>0</KeyPromptFlags>
	</UI>
	<Security>
		<WorkspaceLocking>
			<LockAfterTime>0</LockAfterTime>
			<LockAfterGlobalTime>0</LockAfterGlobalTime>
		</WorkspaceLocking>
		<Policy />
		<MasterPassword>
			<MinimumLength>0</MinimumLength>
			<MinimumQuality>0</MinimumQuality>
		</MasterPassword>
	</Security>
	<Native />
	<PasswordGenerator>
		<AutoGeneratedPasswordsProfile>
			<GeneratorType>CharSet</GeneratorType>
			<Length>20</Length>
			<CharSetRanges>ULD_______</CharSetRanges>
		</AutoGeneratedPasswordsProfile>
		<LastUsedProfile>
			<GeneratorType>CharSet</GeneratorType>
			<Length>20</Length>
			<CharSetRanges>ULD_______</CharSetRanges>
		</LastUsedProfile>
		<UserProfiles />
	</PasswordGenerator>
	<Defaults>
		<OptionsTabIndex>0</OptionsTabIndex>
		<SearchParameters>
			<ComparisonMode>InvariantCultureIgnoreCase</ComparisonMode>
		</SearchParameters>
		<KeySources>
			<Association>
				<DatabasePath></DatabasePath>
				<KeyFilePath></KeyFilePath>
			</Association>
		</KeySources>
	</Defaults>
	<Integration>
		<HotKeyGlobalAutoType>393281</HotKeyGlobalAutoType>
		<HotKeySelectedAutoType>0</HotKeySelectedAutoType>
		<HotKeyShowWindow>393291</HotKeyShowWindow>
		<HotKeyEntryMenu>1</HotKeyEntryMenu>
		<UrlSchemeOverrides>
			<BuiltInOverridesEnabled>1</BuiltInOverridesEnabled>
			<CustomOverrides />
		</UrlSchemeOverrides>
		<ProxyType>System</ProxyType>
	</Integration>
	<Custom />
</Configuration>