@@ -843,7 +843,7 @@ def test_adhoc_1so_change_tailed_files(self):
843
843
try :
844
844
splunk_container_name = generate_random_string ()
845
845
cid = self .client .create_container (self .SPLUNK_IMAGE_NAME , tty = True , ports = [8089 ],
846
- volumes = [ "/playbooks/play.yml" ], name = splunk_container_name ,
846
+ name = splunk_container_name ,
847
847
environment = {
848
848
"DEBUG" : "true" ,
849
849
"SPLUNK_START_ARGS" : "--accept-license" ,
@@ -879,7 +879,7 @@ def test_adhoc_1uf_change_tailed_files(self):
879
879
try :
880
880
splunk_container_name = generate_random_string ()
881
881
cid = self .client .create_container (self .UF_IMAGE_NAME , tty = True , ports = [8089 ],
882
- volumes = [ "/playbooks/play.yml" ], name = splunk_container_name ,
882
+ name = splunk_container_name ,
883
883
environment = {
884
884
"DEBUG" : "true" ,
885
885
"SPLUNK_START_ARGS" : "--accept-license" ,
@@ -1453,7 +1453,7 @@ def test_adhoc_1so_hec_idempotence(self):
1453
1453
try :
1454
1454
splunk_container_name = generate_random_string ()
1455
1455
cid = self .client .create_container (self .SPLUNK_IMAGE_NAME , tty = True , ports = [8089 , 8088 , 9999 ],
1456
- volumes = [ "/playbooks/play.yml" ], name = splunk_container_name ,
1456
+ name = splunk_container_name ,
1457
1457
environment = {
1458
1458
"DEBUG" : "true" ,
1459
1459
"SPLUNK_START_ARGS" : "--accept-license" ,
@@ -1595,13 +1595,175 @@ def test_adhoc_1so_hec_idempotence(self):
1595
1595
if cid :
1596
1596
self .client .remove_container (cid , v = True , force = True )
1597
1597
1598
+ def test_adhoc_1so_hec_custom_cert (self ):
1599
+ # Generate default.yml
1600
+ cid = self .client .create_container (self .SPLUNK_IMAGE_NAME , tty = True , command = "create-defaults" )
1601
+ self .client .start (cid .get ("Id" ))
1602
+ output = self .get_container_logs (cid .get ("Id" ))
1603
+ self .client .remove_container (cid .get ("Id" ), v = True , force = True )
1604
+ # Commands to generate self-signed certificates for Splunk here: https://docs.splunk.com/Documentation/Splunk/latest/Security/ConfigureSplunkforwardingtousesignedcertificates
1605
+ passphrase = "glootie"
1606
+ cmds = [
1607
+ "openssl genrsa -aes256 -passout pass:{pw} -out {path}/ca.key 2048" .format (pw = passphrase , path = FIXTURES_DIR ),
1608
+ "openssl req -new -key {path}/ca.key -passin pass:{pw} -out {path}/ca.csr -subj /CN=localhost" .format (pw = passphrase , path = FIXTURES_DIR ),
1609
+ "openssl x509 -req -in {path}/ca.csr -sha512 -passin pass:{pw} -signkey {path}/ca.key -CAcreateserial -out {path}/ca.pem -days 3" .format (pw = passphrase , path = FIXTURES_DIR ),
1610
+ "openssl genrsa -aes256 -passout pass:{pw} -out {path}/server.key 2048" .format (pw = passphrase , path = FIXTURES_DIR ),
1611
+ "openssl req -new -passin pass:{pw} -key {path}/server.key -out {path}/server.csr -subj /CN=localhost" .format (pw = passphrase , path = FIXTURES_DIR ),
1612
+ "openssl x509 -req -passin pass:{pw} -in {path}/server.csr -SHA256 -CA {path}/ca.pem -CAkey {path}/ca.key -CAcreateserial -out {path}/server.pem -days 3" .format (pw = passphrase , path = FIXTURES_DIR ),
1613
+ "cat {path}/server.pem {path}/server.key {path}/ca.pem > {path}/cert.pem" .format (path = FIXTURES_DIR ),
1614
+ "cat {path}/server.pem {path}/ca.pem > {path}/cacert.pem" .format (path = FIXTURES_DIR )
1615
+ ]
1616
+ for cmd in cmds :
1617
+ execute_cmd = subprocess .check_output (["/bin/sh" , "-c" , cmd ])
1618
+ # Update s2s ssl settings
1619
+ output = re .sub (r''' hec:.*? token: .*?\n''' , r''' hec:
1620
+ enable: True
1621
+ port: 8088
1622
+ ssl: True
1623
+ token: doyouwannadevelopanapp
1624
+ cert: /tmp/defaults/cert.pem
1625
+ password: {}\n''' .format (passphrase ), output , flags = re .DOTALL )
1626
+ # Write the default.yml to a file
1627
+ with open (os .path .join (FIXTURES_DIR , "default.yml" ), "w" ) as f :
1628
+ f .write (output )
1629
+ # Create the container and mount the default.yml
1630
+ cid = None
1631
+ try :
1632
+ splunk_container_name = generate_random_string ()
1633
+ password = "helloworld"
1634
+ cid = self .client .create_container (self .SPLUNK_IMAGE_NAME , tty = True , ports = [8088 , 8089 ],
1635
+ volumes = ["/tmp/defaults/" ], name = splunk_container_name ,
1636
+ environment = {"DEBUG" : "true" ,
1637
+ "SPLUNK_START_ARGS" : "--accept-license" ,
1638
+ "SPLUNK_PASSWORD" : password },
1639
+ host_config = self .client .create_host_config (binds = [FIXTURES_DIR + ":/tmp/defaults/" ],
1640
+ port_bindings = {8089 : ("0.0.0.0" ,), 8088 : ("0.0.0.0" ,)})
1641
+ )
1642
+ cid = cid .get ("Id" )
1643
+ self .client .start (cid )
1644
+ # Poll for the container to be ready
1645
+ assert self .wait_for_containers (1 , name = splunk_container_name )
1646
+ # Check splunkd
1647
+ assert self .check_splunkd ("admin" , password )
1648
+ # Check if the created file exists
1649
+ exec_command = self .client .exec_create (cid , "cat /opt/splunk/etc/apps/splunk_httpinput/local/inputs.conf" , user = "splunk" )
1650
+ std_out = self .client .exec_start (exec_command )
1651
+ assert "[http://splunk_hec_token]" in std_out
1652
+ assert "serverCert = /tmp/defaults/cert.pem" in std_out
1653
+ assert "sslPassword = " in std_out
1654
+ # Check HEC using the custom certs
1655
+ hec_port = self .client .port (cid , 8088 )[0 ]["HostPort" ]
1656
+ url = "https://localhost:{}/services/collector/event" .format (hec_port )
1657
+ kwargs = {"json" : {"event" : "hello world" }, "headers" : {"Authorization" : "Splunk doyouwannadevelopanapp" }, "verify" : "{}/cacert.pem" .format (FIXTURES_DIR )}
1658
+ status , content = self .handle_request_retry ("POST" , url , kwargs )
1659
+ assert status == 200
1660
+ except Exception as e :
1661
+ self .logger .error (e )
1662
+ raise e
1663
+ finally :
1664
+ if cid :
1665
+ self .client .remove_container (cid , v = True , force = True )
1666
+ files = [
1667
+ os .path .join (FIXTURES_DIR , "ca.key" ),
1668
+ os .path .join (FIXTURES_DIR , "ca.csr" ),
1669
+ os .path .join (FIXTURES_DIR , "ca.pem" ),
1670
+ os .path .join (FIXTURES_DIR , "cacert.pem" ),
1671
+ os .path .join (FIXTURES_DIR , "server.key" ),
1672
+ os .path .join (FIXTURES_DIR , "server.csr" ),
1673
+ os .path .join (FIXTURES_DIR , "server.pem" ),
1674
+ os .path .join (FIXTURES_DIR , "cert.pem" ),
1675
+ os .path .join (FIXTURES_DIR , "default.yml" )
1676
+ ]
1677
+ self .cleanup_files (files )
1678
+
1679
+ def test_adhoc_1uf_hec_custom_cert (self ):
1680
+ # Generate default.yml
1681
+ cid = self .client .create_container (self .UF_IMAGE_NAME , tty = True , command = "create-defaults" )
1682
+ self .client .start (cid .get ("Id" ))
1683
+ output = self .get_container_logs (cid .get ("Id" ))
1684
+ self .client .remove_container (cid .get ("Id" ), v = True , force = True )
1685
+ # Commands to generate self-signed certificates for Splunk here: https://docs.splunk.com/Documentation/Splunk/latest/Security/ConfigureSplunkforwardingtousesignedcertificates
1686
+ passphrase = "glootie"
1687
+ cmds = [
1688
+ "openssl genrsa -aes256 -passout pass:{pw} -out {path}/ca.key 2048" .format (pw = passphrase , path = FIXTURES_DIR ),
1689
+ "openssl req -new -key {path}/ca.key -passin pass:{pw} -out {path}/ca.csr -subj /CN=localhost" .format (pw = passphrase , path = FIXTURES_DIR ),
1690
+ "openssl x509 -req -in {path}/ca.csr -sha512 -passin pass:{pw} -signkey {path}/ca.key -CAcreateserial -out {path}/ca.pem -days 3" .format (pw = passphrase , path = FIXTURES_DIR ),
1691
+ "openssl genrsa -aes256 -passout pass:{pw} -out {path}/server.key 2048" .format (pw = passphrase , path = FIXTURES_DIR ),
1692
+ "openssl req -new -passin pass:{pw} -key {path}/server.key -out {path}/server.csr -subj /CN=localhost" .format (pw = passphrase , path = FIXTURES_DIR ),
1693
+ "openssl x509 -req -passin pass:{pw} -in {path}/server.csr -SHA256 -CA {path}/ca.pem -CAkey {path}/ca.key -CAcreateserial -out {path}/server.pem -days 3" .format (pw = passphrase , path = FIXTURES_DIR ),
1694
+ "cat {path}/server.pem {path}/server.key {path}/ca.pem > {path}/cert.pem" .format (path = FIXTURES_DIR ),
1695
+ "cat {path}/server.pem {path}/ca.pem > {path}/cacert.pem" .format (path = FIXTURES_DIR )
1696
+ ]
1697
+ for cmd in cmds :
1698
+ execute_cmd = subprocess .check_output (["/bin/sh" , "-c" , cmd ])
1699
+ # Update s2s ssl settings
1700
+ output = re .sub (r''' hec:.*? token: .*?\n''' , r''' hec:
1701
+ enable: True
1702
+ port: 8088
1703
+ ssl: True
1704
+ token: doyouwannadevelopanapp
1705
+ cert: /tmp/defaults/cert.pem
1706
+ password: {}\n''' .format (passphrase ), output , flags = re .DOTALL )
1707
+ # Write the default.yml to a file
1708
+ with open (os .path .join (FIXTURES_DIR , "default.yml" ), "w" ) as f :
1709
+ f .write (output )
1710
+ # Create the container and mount the default.yml
1711
+ cid = None
1712
+ try :
1713
+ splunk_container_name = generate_random_string ()
1714
+ password = "helloworld"
1715
+ cid = self .client .create_container (self .UF_IMAGE_NAME , tty = True , ports = [8088 , 8089 ],
1716
+ volumes = ["/tmp/defaults/" ], name = splunk_container_name ,
1717
+ environment = {"DEBUG" : "true" ,
1718
+ "SPLUNK_START_ARGS" : "--accept-license" ,
1719
+ "SPLUNK_PASSWORD" : password },
1720
+ host_config = self .client .create_host_config (binds = [FIXTURES_DIR + ":/tmp/defaults/" ],
1721
+ port_bindings = {8089 : ("0.0.0.0" ,), 8088 : ("0.0.0.0" ,)})
1722
+ )
1723
+ cid = cid .get ("Id" )
1724
+ self .client .start (cid )
1725
+ # Poll for the container to be ready
1726
+ assert self .wait_for_containers (1 , name = splunk_container_name )
1727
+ # Check splunkd
1728
+ assert self .check_splunkd ("admin" , password )
1729
+ # Check if the created file exists
1730
+ exec_command = self .client .exec_create (cid , "cat /opt/splunkforwarder/etc/apps/splunk_httpinput/local/inputs.conf" , user = "splunk" )
1731
+ std_out = self .client .exec_start (exec_command )
1732
+ assert "[http://splunk_hec_token]" in std_out
1733
+ assert "serverCert = /tmp/defaults/cert.pem" in std_out
1734
+ assert "sslPassword = " in std_out
1735
+ # Check HEC using the custom certs
1736
+ hec_port = self .client .port (cid , 8088 )[0 ]["HostPort" ]
1737
+ url = "https://localhost:{}/services/collector/event" .format (hec_port )
1738
+ kwargs = {"json" : {"event" : "hello world" }, "headers" : {"Authorization" : "Splunk doyouwannadevelopanapp" }, "verify" : "{}/cacert.pem" .format (FIXTURES_DIR )}
1739
+ status , content = self .handle_request_retry ("POST" , url , kwargs )
1740
+ assert status == 200
1741
+ except Exception as e :
1742
+ self .logger .error (e )
1743
+ raise e
1744
+ finally :
1745
+ if cid :
1746
+ self .client .remove_container (cid , v = True , force = True )
1747
+ files = [
1748
+ os .path .join (FIXTURES_DIR , "ca.key" ),
1749
+ os .path .join (FIXTURES_DIR , "ca.csr" ),
1750
+ os .path .join (FIXTURES_DIR , "ca.pem" ),
1751
+ os .path .join (FIXTURES_DIR , "cacert.pem" ),
1752
+ os .path .join (FIXTURES_DIR , "server.key" ),
1753
+ os .path .join (FIXTURES_DIR , "server.csr" ),
1754
+ os .path .join (FIXTURES_DIR , "server.pem" ),
1755
+ os .path .join (FIXTURES_DIR , "cert.pem" ),
1756
+ os .path .join (FIXTURES_DIR , "default.yml" )
1757
+ ]
1758
+ self .cleanup_files (files )
1759
+
1598
1760
def test_adhoc_1so_hec_ssl_disabled (self ):
1599
1761
# Create the container
1600
1762
cid = None
1601
1763
try :
1602
1764
splunk_container_name = generate_random_string ()
1603
1765
cid = self .client .create_container (self .SPLUNK_IMAGE_NAME , tty = True , ports = [8089 , 8088 ],
1604
- volumes = [ "/tmp/defaults/" ], name = splunk_container_name ,
1766
+ name = splunk_container_name ,
1605
1767
environment = {
1606
1768
"DEBUG" : "true" ,
1607
1769
"SPLUNK_START_ARGS" : "--accept-license" ,
@@ -1640,7 +1802,7 @@ def test_adhoc_1uf_hec_ssl_disabled(self):
1640
1802
try :
1641
1803
splunk_container_name = generate_random_string ()
1642
1804
cid = self .client .create_container (self .UF_IMAGE_NAME , tty = True , ports = [8089 , 8088 ],
1643
- volumes = [ "/tmp/defaults/" ], name = splunk_container_name ,
1805
+ name = splunk_container_name ,
1644
1806
environment = {
1645
1807
"DEBUG" : "true" ,
1646
1808
"SPLUNK_START_ARGS" : "--accept-license" ,
0 commit comments