Keepass improve: Difference between revisions

From Essential
Jump to navigation Jump to search
Line 113: Line 113:
<pre>
<pre>
// Version history:
// Version history:
// 2013-05-26 Antonio DA SILVA PACHECO (ynotopec@gmail.com)
// 2013-05-26 Antonio DA SILVA PACHECO (pacheco at infocepo.com)
//  Modification from static directory to dynamic
//  Modification from static directory to dynamic
//  Defines added
//  Defines added

Revision as of 02:10, 4 March 2022

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 (pacheco at infocepo.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>