Mwp.Reid at Queens-Belfast.AC.UK
Mwp.Reid at Queens-Belfast.AC.UK
Thu Apr 17 16:44:57 CDT 2003
Heres a basic security script from sqlsecurity.com May prove useful to some of you. Martin <Copy from here> --SQL Server 2000 Lockdown Script --by Chip Andrews (www.sqlsecurity.com) --12/23/2002 -- --The purpose of this script is to provide administrators (SQL Server or otherwise) a baseline --lockdown configuration for new installations. These settings should disable potentially dangerous --functionality while leaving the server operational and still capabable of Service Pack and hotfix --installations. Feel free to provide feedback at www.sqlsecurity.com if you find any issues or --have any suggestions for improvement. -- --Project Goals: -- * Must support named instances -- * Must not break future Service Pack and hotfixes installations -- * Must strive to disable rarely used functionality but not break common applications (80-20 rule) -- * Must be easily runnable from the command prompt for mass distribution -- --Notes: -- --*You will note that no Extended Stored Procedures have been dropped in the script. This is due to several reasons: -- 1. It causes some problems with Service Packs and hotfix installations when certain functions are disabled -- 2. Blocking access to non-sysadmin users is more easily achieved by dropping execute permissions -- 3. Sysadmins can easily add them back so dropping them really serves no real purpose --*The last script item has been commented out because it effectively blocks all network access to the SQL Server -- and thus violates the 80-20 rule. Feel free to enable it for local-only SQL Server installs. -- -- SET NOCOUNT ON PRINT '*** Begin SQL Server 2000 Lockdown Script v1.0 ***' PRINT '' PRINT 'SERVER NAME : ' + @@SERVERNAME PRINT '' -- -- --Check SQL Server Service Account for LocalSystem Authority - Send warning --It should be noted that it may be possible to create a local account if LocalSystem is found --and alter the service account here in the script. However, since there are also file ACL and registry --permissions to deal with then its probably best left to the Enterprise Manager to do this. CREATE TABLE #user (value VARCHAR(50), data VARCHAR(50)) IF (charindex('\',@@SERVERNAME)=0) INSERT #user EXEC master..xp_regread 'HKEY_LOCAL_MACHINE' ,'SYSTEM\CurrentControlSet\Services\MSS QLSERVER','ObjectName' ELSE BEGIN PRINT 'Note: SQL Server was determined to be a named instance' PRINT '' DECLARE @RegistryPath varchar(200) SET @RegistryPath = 'SYSTEM\CurrentControlSet\Services\MSSQL$' + RIGHT(@@SERVERNAME,LEN(@@SERVERNAME)-CHARINDEX('\',@@SERVERNAME)) INSERT #user EXEC master..xp_regread 'HKEY_LOCAL_MACHINE' , at RegistryPath,'ObjectName' END SELECT TOP 1 DATA AS [SQL Server Service Account] FROM #USER IF (SELECT TOP 1 DATA FROM #user)='LocalSystem' PRINT '*** ALERT LOCALSYSTEM AUTHORITY BEING USED FOR SQL SERVER SERVICE ACCOUNT IS NOT RECOMMENDED. ***' DROP TABLE #user PRINT '' -- -- Confirm the latest service pack and hotfixes have been applied by selecting -- the server version and comparing it to the most current SQL Server -- version (at the time of writing that was 8.00.665 for SQL Server 2000). -- (Although we are not applying the latest patch in this script, we can still -- output a message warning the user of the script to apply the needed patches as long as you capture the output.) SELECT @@version as [SQL Server Version] IF NOT (charindex('8.00.665',@@version)>0) BEGIN print '*** WARNING - SQL Server NOT PROPERLY PATCHED! ***' END GO -- -- Enable Windows Authentication as the only login method to prevent against sa -- account attacks and the weak internal SQL Server authentication model. IF (charindex('\',@@SERVERNAME)=0) EXECUTE master.dbo.xp_regwrite N'HKEY_LOCAL_MACHINE',N'Software\Microsoft\MSSQLServer\MSSQLServer',N'LoginMode ',N'REG_DWORD',1 ELSE BEGIN DECLARE @RegistryPath varchar(200) SET @RegistryPath = 'Software\Microsoft\Microsoft SQL Server\' + RIGHT(@@SERVERNAME,LEN(@@SERVERNAME)-CHARINDEX('\',@@SERVERNAME)) + '\MSSQLServer' EXECUTE master..xp_regwrite 'HKEY_LOCAL_MACHINE', at RegistryPath,N'LoginMode',N'REG_DWORD ',1 END GO -- -- Set strong sa account password (in this case a concatenation of two -- unique identifiers). This password can easily be reset later by using a -- trusted connection while logged in as a local administrator or any user -- who is a member of the System Administrator role. DECLARE @pass char(72) SELECT @pass=convert(char(36),newid())+convert(char(36),newid()) EXECUTE master..sp_password null, at pass,'sa' GO -- -- Enable full auditing to monitor both successful and failed access to the -- SQL Server. You may want to scale this back to failed-only is log space -- is a problem. IF (charindex('\',@@SERVERNAME)=0) EXECUTE master.dbo.xp_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer',N'AuditLevel',N'REG_DWORD',3 ELSE BEGIN DECLARE @RegistryPath varchar(200) SET @RegistryPath = 'Software\Microsoft\Microsoft SQL Server\' + RIGHT(@@SERVERNAME,LEN(@@SERVERNAME)-CHARINDEX('\',@@SERVERNAME)) + '\MSSQLServer' EXECUTE master..xp_regwrite 'HKEY_LOCAL_MACHINE', at RegistryPath,N'AuditLevel',N'REG_DWOR D',3 END GO -- -- Disable SQLAgent, Microsoft Distributed Transaction Coordinator (MSDTC), and MSSEARCH -- since they may potentially represent unnecessary services. There are no multiple instances of these services. EXECUTE msdb..sp_set_sqlagent_properties @auto_start = 0 GO EXECUTE master..xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'SYSTEM\CurrentControlSet\Services\MSDTC', N'Start', N'REG_DWORD', 3 GO EXECUTE master..xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'SYSTEM\CurrentControlSet\Services\MSSEARCH', N'Start', N'REG_DWORD', 3 GO -- --Diable adhoc queries for each data provider since this functionality is ripe for abuse. Once again, if --your application requires this you can add the functionality back on a per provider basis. EXECUTE master.dbo.xp_regwrite N'HKEY_LOCAL_MACHINE',N'Software\Microsoft\MSSQLServer\Providers\SQLOLEDB',N'Di sallowAdhocAccess',N'REG_DWORD',1 GO EXECUTE master.dbo.xp_regwrite N'HKEY_LOCAL_MACHINE',N'Software\Microsoft\MSSQLServer\Providers\Microsoft.Jet. Oledb.4.0',N'DisallowAdhocAccess',N'REG_DWORD',1 GO EXECUTE master.dbo.xp_regwrite N'HKEY_LOCAL_MACHINE',N'Software\Microsoft\MSSQLServer\Providers\MSDAORA',N'Dis allowAdhocAccess',N'REG_DWORD',1 GO EXECUTE master.dbo.xp_regwrite N'HKEY_LOCAL_MACHINE',N'Software\Microsoft\MSSQLServer\Providers\ADSDSOObject', N'DisallowAdhocAccess',N'REG_DWORD',1 GO EXECUTE master.dbo.xp_regwrite N'HKEY_LOCAL_MACHINE',N'Software\Microsoft\MSSQLServer\Providers\DB2OLEDB',N'Di sallowAdhocAccess',N'REG_DWORD',1 GO EXECUTE master.dbo.xp_regwrite N'HKEY_LOCAL_MACHINE',N'Software\Microsoft\MSSQLServer\Providers\MSIDXS',N'Disa llowAdhocAccess',N'REG_DWORD',1 GO EXECUTE master.dbo.xp_regwrite N'HKEY_LOCAL_MACHINE',N'Software\Microsoft\MSSQLServer\Providers\MSQLImpProv',N 'DisallowAdhocAccess',N'REG_DWORD',1 GO EXECUTE master.dbo.xp_regwrite N'HKEY_LOCAL_MACHINE',N'Software\Microsoft\MSSQLServer\Providers\MSSEARCHSQL',N 'DisallowAdhocAccess',N'REG_DWORD',1 GO EXECUTE master.dbo.xp_regwrite N'HKEY_LOCAL_MACHINE',N'Software\Microsoft\MSSQLServer\Providers\MSDASQL',N'Dis allowAdhocAccess',N'REG_DWORD',1 GO -- --Remove the pubs and northwind sample databases since they represent known targets with minimal --permissions for potential attackers. USE master DROP DATABASE northwind DROP DATABASE pubs GO -- --Tighten permissions on jobs procedures in case the SQL Agent service is ever activated to prevent low --privilege users from submitting or managing jobs. USE msdb REVOKE execute on sp_add_job to public REVOKE execute on sp_add_jobstep to public REVOKE execute on sp_add_jobserver to public REVOKE execute on sp_start_job to public GO -- --Tighten permissions on web tasks table to keep malicious users from creating or altering tasks. USE msdb REVOKE update on mswebtasks to public REVOKE insert on mswebtasks to public GO -- --Tighten permissions on DTS package connection table so that malicious users cannot affect DTS packages. USE msdb REVOKE select on RTblDBMProps to public REVOKE update on RTblDBMProps to public REVOKE insert on RTblDBMProps to public REVOKE delete on RTblDBMProps to public GO -- --Tighten permissions on extended procedures that require heavy use but should not be allowed public access. USE master REVOKE execute on sp_runwebtask to public REVOKE execute on sp_readwebtask to public REVOKE execute on sp_MSSetServerProperties to public REVOKE execute on sp_MScopyscriptfile to public REVOKE execute on sp_MSsetalertinfo to public REVOKE execute on xp_regread to public REVOKE execute on xp_instance_regread to public GO -- --Revoke guest access to msdb in order to keep any non system administrators from accessing the database without explicit permissions. USE msdb EXECUTE sp_revokedbaccess guest GO -- --Turn off allow remote access to keep other SQL Servers from connecting to this server via RPC. EXECUTE sp_configure 'remote access', '0' GO RECONFIGURE WITH OVERRIDE GO -- --Verify that the capability to allow access to system tables is disabled. EXECUTE sp_configure 'allow updates', '0' GO RECONFIGURE WITH OVERRIDE GO -- --Increase SQL Server log history threshold in order to maintain logs for a longer amount of time. IF (charindex('\',@@SERVERNAME)=0) EXECUTE master.dbo.xp_regwrite N'HKEY_LOCAL_MACHINE',N'Software\Microsoft\MSSQLServer\MSSQLServer',N'NumErrorL ogs',N'REG_DWORD',365 ELSE BEGIN DECLARE @RegistryPath varchar(200) SET @RegistryPath = 'Software\Microsoft\Microsoft SQL Server\' + RIGHT(@@SERVERNAME,LEN(@@SERVERNAME)-CHARINDEX('\',@@SERVERNAME)) + '\MSSQLServer' EXECUTE master..xp_regwrite 'HKEY_LOCAL_MACHINE', at RegistryPath,N'NumErrorLogs',N'REG_DW ORD',365 END GO -- --Remove any residual setup files (\sqldir\setup.iss - \winnt\setup.iss - \winnt\sqlstp.log) that may be --lingering on the file system. These scripts now include system variables thanks to Carlos Moran EXECUTE master.dbo.xp_cmdshell 'if exist %windir%\setup.iss del %Windir% \setup.iss' GO EXECUTE master.dbo.xp_cmdshell 'if exist %windir%\sqlstp.log del %Windir% \sqlstp.log' GO EXECUTE master.dbo.xp_cmdshell 'if exist "%ProgramFiles%\microsoft sql server\mssql\install\setup.iss" del "%ProgramFiles%\microsoft sql server\mssql\install\setup.iss"' GO -- --Remove any un-used network libraries. Since this is a hardened server, all netlibs can be removed until --external connectivity requirements are identified. Connections to the local server are still possible --using the Shared Memeory netlib which is always in effect by specifiying (local) or (a period) as --the server name. The other netlibs can easily be restored using the Server Network Utility. --(You must stop and restart the SQL Server for this change to go into effect) --This step effectively blocks all network access to this SQL Server. Please be advised of this before --applying this step. --NOTE: This step has been removed by default. Feel free to add it when applying to local-only installations --such as MSDE applications or Visual Studio.NET/.NET SDK installs -- --EXECUTE master.dbo.xp_regwrite N'HKEY_LOCAL_MACHINE',N'SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\SuperSocketN etLib', N'ProtocolList',N'REG_SZ','' --GO -- -- PRINT '*** Please Stop and Start the SQL Server Service Instance in order to implement changes ***' PRINT '' PRINT '*** End SQL Server 2000 Lockdown Script ***'