Un monde d'octets

Aller au contenu | Aller au menu | Aller à la recherche

vendredi, mai 20 2022

Wayland azerty et gnome qwerty ...

ca arrive de temps en temps (installation fraiche) que même si wayland est en azerty, les logiciels pur gnome sont en qwerty. la solution :

setxkbmap fr

pour automatiser cela, créez le fichier $HOME/.config/autostart/kbfr.desktop contenant :

[Desktop Entry]
Name=kbfr
Exec=setxkbmap fr
Terminal=false
Type=Application
X-GNOME-Autostart-enabled=true

et voila, à l'ouverture de gnome, ce lanceur sera exécuté et votre clavier passera en français !

lundi, avril 25 2022

Tracker : Disabling

To disable tracker3 on ubuntu, do this :

systemctl --user mask tracker-extract-3.service tracker-miner-fs-3.service tracker-miner-rss-3.service tracker-writeback-3.service tracker-xdg-portal-3.service tracker-miner-fs-control-3.service
tracker3 reset -s -r

puis pour controler :

tracker3 daemon

et vos devez obtenir quelque chose comme ca :

Miners:
25 avril 2022, 21:16:25:  ✗     File System          - Not running or is a disabled plugin

jeudi, mars 24 2022

Threads et parallélisme

Suivre les sous-processus d'un ffmpeg :

pstree -p $(pgrep ffmpeg) -a

Trouver les communications ipc d'un process

ipcs -p $(pgrep ffmpeg)

jeudi, mars 3 2022

Prise en main d'une architecture 101

Les axes de questions

  • Installation
  • Architecture
  • MAJ
  • Backup/Restore
  • Configuration
  • Développement supplémentaire - shell / python / ansible
  • Intégration dans le SI - Quand ? OU ? Comment ?
  • PCA / PRA

Exemples

  • Avez vous des plans d'architecture ?
  • Pourriez vous expliciter cette partie du plan ?
  • Comment est ce installé ? Docker ? Ansible ? Scripts ? Copie de VM Template ?
  • Et dans ce cas, ou est stocké la configuration ? Dossier ? Http ? Git ?
  • Comment distribuez vous vos configurations ? (script, puppet, ansible ?)
  • Utilisez vous des certificats ssl ? quel type ? si letsencrypt, la configuration est faite via api (.well-known) ou par DNS (IN TXT). Le renouvellement est automatisé avec acme ?
  • Avez vous des pages décrivant, pour chaque pan d'architecture, les configurations principales (et secondaires)
  • Quel est votre process de MAJ ? Sur quelle base de temps ?
  • Utiliser vous ces outils pour autre chose ? (script, puppet, ansible)
  • Quelle est votre politique de sauvegarde (image de vm, sauvegarde de fichiers, sauvgarde bdd)
  • Faites vous des tests de restauration périodiques ?
  • Comment assurez vous le monitoring ? la réponse aux alertes ?
  • Avez vous une haute disponibilité sur ce service ? de quel type ?
  • Votre architecture est elle redondante ?

vendredi, janvier 28 2022

OpenSSL : Selft signed certificate, erreur 19, extration de CA

Il arrive qu'une connexion SSL échoue pour cause de certificats self signed ou untrusted CA. Si vous avez la certitude de la validité d la chain authority, vous pouvez la récupérer ainsi :

echo -n | \
  openssl s_client -showcerts -connect www.test.fr:443 -debug | \
  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ca.cert 

Vous récupérez le CA du serveur dans le fichier ca.cert que vous pouvez ensuite mettre dans votre trousseau de certificats valides.

mercredi, janvier 26 2022

OpenSSL : établir une connection starttls

openssl s_client -starttls smtp \
                 -crlf -CAfile ca-certificates.crt \
                 -connect smtp.server.fr:25

ca-certificates.crt est l'autorité de certification du serveur distant, en cas de self-signed.

vendredi, janvier 14 2022

Osx : en finit avec ces applications tierces non identifiées ....

sudo spctl --master-disable

Git : en cas d'erreur de commit

Depuis 4 jours j'ai accidentelement fait mes commits sur la mauvais branche.

Par chance, personne n'a commité en même temps que moi, j'ai donc pu procéder au nettoyage comme suit :

git reset --hard <sha>
git clean -f -d
git push -f

Et voila, la branch est revenue à l'état du <sha> spécifiée, tout propre !

mardi, janvier 11 2022

Java et tls1.0

TLS1.0 est déprécié, certes mais il existe encore des sites l'utilisant et pour lequel java n'y peut plus accéder. Pour rétablir TLS1.0 en client java, il faut réactiver les policies historiques :

update-crypto-policies --set LEGACY

samedi, janvier 8 2022

Osx prometheus node exporter

Pour installer le node exporter de prometheus sur osx, faites confiance a homebrew :

brew install node_exporter

puis ajoutez les lignes suivantes a /usr/local/etc/node_exporter.args

--web.listen-adress :9101

Et démarrez le service :

brew services start node_exporter

Votre exporter est maintenant fonctionnel

mardi, décembre 28 2021

Chocolatey : un brew pour windows

Chocolatey est a l'instar de brew sous osx, un installeur de packages sous windows.

Pour l'installer, vous exécutez en tant qu'administrateur la commande powershell suivante :

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

Vous pouvez ensuite taper des commandes comme :

choco install packer
choco install googlechrome
choco install sysinternals

et choco vous installera ces outils sans que vous n'ayez a lever le petit doigt (sauf repondre "yes").

Très pratique si vous ne voulez pas tout faire a la main

mardi, décembre 7 2021

Selinux : audit2allow quick permission correction

Filter certwatch alert in audit.log and process it to audit2allow to build a corrective pp :

grep certwatch /var/log/audit/audit.log | audit2allow -M mycertwatch2

make the policy active :

semodule -i mycertwatch2.pp

mercredi, novembre 17 2021

Elasticsearch : recherche avec filtres

curl -XGET 127.0.0.1:9200/movies/_search?pretty -d '
{
  "query":{
      "bool": {
	    "must": {"term": {"title":"trek"}},
            "filter": {"range": {"year": {"gte": 2010}}}
	}
   }
}'

Filter by exact values

{"term": {"year": 2014}}

Match if any exact values in a list match :

{"terms": {"genre": ["Sci-Fi","Adventure"]}}

Find number or dates in a given range (gt,gte,lt,lte)

{range": {"year": {"gte": 2010}}}

Find document where a field exists :

{"exists": {"field": "tags"}}

Find document where a field is missing :

{"missing": {"field": "tags"}}

Combine filters with Boolean logic (must, must_not, should)

Voir aussi :

Match, Match_all, Multi_Match, Bool

lundi, novembre 8 2021

Elastic search : simple requête full text

Nous utilons la requete json suivante :

{
  "query": {
     "math_phrase" : {
	"text_entry" : "to be or not to be" 
     }
  }
}

puis vous pouvez interroger votre ES avec la requete suivante :

curl -H "content-type: application/json" <url> -d @<file.json>

jeudi, octobre 28 2021

Docker : one liners

Détruire tous les containers exited

docker rm $(docker ps -qa --filter "status=exited")

mercredi, octobre 27 2021

Elastic search ingest filter et filebeat

Ayant mis les logs de container docker en json, j'ai installé filebeat pour shipper directement ceux-ci à elasticsearch. Seul bémol, c'est que filebeat met comme timestamp source, l'heure à laquelle il à récolté (harvest) les logs.

Pour corriger ceci, il faut passer par un process d'ingest spécifique qui modifiera le document.

Nous créons notre ingest avec la commande suivante :

curl -XPUT pvalois:xxxxxxxxx@10.10.31.60:9200/_ingest/pipeline/json_timestamp \
-H "Content-type: application/json" \
-d '{
    "processors": [
      {
        "set": {
          "field": "_source.@timestamp",
          "value": "{{json.time}}",
	  "ignore_failure": true
        }
      }
    ]
}'

Comme ou le voir celle-ci crée un ingest préprocesseur nommé "json_timestamp" qui copie le content de json.time dans _source.@timestamp, corrigeant ainsi l'heure de réception du message.

Cependant la création de cet ingest ne suffit pas, il faut notifier a filebeat de l'utiliser lors de la communication avec elasticsearch. Pour cela, nous configurons le /etc/filebeat/filebeat.yml comme suit :

output.elasticsearch:
  hosts: [pvalois:xxxxxxxx@10.10.31.60:9200]
  pipeline: json_timestamp

Et voila, nos messages envoyés via filebeat seront maintenant livré à notre processor json.timestamp et tout sera propre à l'importation, même si celle-ci est faite à posteriori.

mardi, octobre 26 2021

Swap sous linux

SI vous n'avez pas prévu de partition de swap mais qu'au final vous finissez par en ajouter ultérieurement, voici le processus

ici nous créons un swap de 32Go :

dd if=/dev/zero of=/swap count=$(echo 1024X1024|bc) count=$(32x1024|bc)
mkswap /swap
swapon /swap

Ensuite nous pouvons régler "l'agressivité du swap". Dans le kernel linux, il existe le concept de swapiness qui détermine à quel pourcentaire de mémoire occupée, nous commencons à utiliser le swap :

cat /proc/sys/vm/swappiness
60

par défaut, 60%.

echo 40 > /proc/sys/vm/swappiness

et maintenant, 40%

Voila pour les bases !

lundi, octobre 25 2021

Journalcrl

journalctl -u logstash --since "10 minutes ago" -o json | jq . | tail -60

vendredi, octobre 22 2021

Compter les containers docker par réseaux docker (oneliner)

docker network inspect $(docker network ls -q)| jq '.[]|(.Name + " " + ((.Containers | length)|tostring))' -r

mercredi, octobre 20 2021

Ceph : premiers pas ... utiles

Bon pour commencer avec ceph, il est bon de trouver les éléments le composant, pour cela :

ceph node ls all

Ensuite les operations de contrôle de l'état de votre cluster ceph :

ceph health
ceph status
ceph -w 

Pour les opérations courantes mais qui n'arrivenent quand même pas tout le temps, je renvoie à l'operation guide ceph

mercredi, octobre 13 2021

Podman & Docker

Docker est le plus connu des systèmes de container. mais Podman est une alternative poussée par Openshift, le système de clustering de Redhat. Quelques différences sont à connaitre.

Les registries

Docker sait ou chercher des l'installation. Podman non.

Il faut éditer le fichier /etc/containers/registries.conf et y ajouter :

[registries.search]
registries = ["registry.access.redhat.com", "quay.io"]

Si votre registry ne supporte pas https :

[registries.insecure]
registries = ['localhost:5000']

mardi, octobre 12 2021

Ceph Cheatsheet

ceph -w
ceph health detail
ceph osd df
ceph osd find
ceph osd blocked-by
ceph osd pool ls detail
ceph osd pool get rbd all

ceph pg dump | grep pgid
ceph pg pgid
ceph osd primary-affinity 3 1.0
ceph osd map rbd obj

Enable/Disable osd

ceph osd out 0
ceph osd in 0

PG repair

ceph osd map rbd file
ceph pg 0.1a query
ceph pg 0.1a 
ceph pg scrub 0.1a #Checks file exists on OSDs
ceph pg deep-scrub 0.1a #Checks file integrity on OSDs
ceph pg repair 0.1a #Fix problems

Delete osd

ceph osd tree
ceph osd out osd.1
sudo systemctl stop ceph-osd@1.service
ceph osd crush remove osd.1
reph auth del osd.1
ceph osd rm osd.1
osd primary-affinity
ceph pg pgid mark_unfound_lost revert|delete
ceph osd liost osdid --yes-i-really-mean-it

Ceph control

ceph daemon osd.1 config get osd_scrub_min-interval

ceph --admin-daemon socket-file-path command
/var/run/ceph/$cluster-$type.$id.asok
perf dump
config show
dump_historic_ops
scrub_path

Version check

ceph tell mon.* version
ceph tell osd.* version

Updates

Update one mon at the time

/usr/share/ceph-ansible/infrastructure-playbooks/rolling_updates.yaml

Ceph cluster flags

ceph osd set

noup    #Do not auto mark osd as up state
nopdown #Do not auto mark OSD as down state
noout   # Do not remove any osds from crush map. Used when performinig maintenance os parts of the cluster. Prevents crush from auto reblancing the cluster when OSDs are stopped.
noin    # Mons will mark running OSDs with the in state. prevents data from beeing auto allocated to that specific OSD
norecover # Prevents any recovery operations. Used when performing maintenance or a cluster shutdown
nobackfill # Prevents any backfill operation. Used when performing maintenance of a cluster. 
noscrub # No scrubbing operations. Scrubbing has performance impact on a PG on the OSD. If a OSD is too slow it will be marked as down.
nodeep-scrub 
norebalance # Prevents rebalancing from runniung

Crush map

ceph osd getcrushmap -o map.bin
crushtool -d map.bin -o map.txt
crushtool -i map.bin --test --show-mapping --rule=5 --num-rep 3
crushtool -c map.txt -o map.bin
ceph osd setcrushmap -i map.bin

ceph osd crush class ls
ceph osd crush tree
ceph osd crush rule ls

ceph osd pool create fast_ssd 32 32 onssd
ceph pg dump pgs_brief
ceph pg dump pgs_brief | grep ^46 #Pool ID
ceph osd lspools
ceph df

Buckets

ceph osd crush add-bucket default-pool root
ceph osd crush add-bucket rack1 rack
ceph osd crush add-bucket rack2 rack
ceph osd crush add-bucket hosta host
ceph osd crush add-bucket hostb host
ceph osd crush move rack1 root=default-pool
ceph osd crush move rack2 root=default-pool
ceph osd crush move hosta rack=rack1
ceph osd crush move hostb rack=rack2

ceph osd crush tree

OSD tools

ceph osd set-full-ratio 0.97
ceph osd set-nearfull-ratio 0.9
ceph osd dump

ceph osd getmap -o ./map.bin
osdmaptool --print ./map.bin
osdmaptool --export-crush ./crush.bin ./map.bin
crushtool -d ./crush.bin -o ./crush.txt 
crushtool -c ./crush.txt -o crushnew.bin
osdmaptool --import-crush ./crushnew.bin ./map.bin
osdmaptool --test-map-pgs-dump ./map.bin

OSD files

/var/lib/ceph/osd/ceph-1/current/0.1a_head/

Moving an OSD journal to an SSD

ceph osd set noout
systemctl stop ceph-osd@3.service
ceph-osd -i 3 --flush-journal
rm -rf /var/lib/ceph/osd/ceph-3/journal
ln -s /dev/sdc1 /var/lib/ceph/osd/ceph-3/journal
ceph-osd -i 3 --mkjournal
systemctl start ceph-osd@3.service
ceph osd unset noout

Placement gorup calc

Total palcement grous = (OSDs * 100) / Number of replicas
Start between 100 to 200 - Never go above 300+

ceph osd pool get rbd pg_num #Total number of pgs in the pool 
ceph osd pool get rbd pgp_num #Total number of of pgs used for hasing in the pool

Rados

rados -p rbd put file /etc/ceph/ceph.conf

Performance

iostat -x

OS Tuning

systcl net.ipv4.tcp_mem
systcl net.ipv4.tcp_rmem
systcl net.ipv4.tcp_wmem
vm.dirty_background_ratio
vm.dirty_ratio
vm.dirty_background_bytes
vm.dirty_bytes
vm.zone_reclaim_node
vm.swappiness
vm.min_free_kbytes

tuned-adm list
tuned-adm active
tuned-adm profile network-latency
tuned-adm profile network-throughput

Enable jumboframes

cat /sys/block/device/queue/scheduler
noop deadline [cfq]
sudo sh -c "echo deadline" > /sys/block/sdb/queue/scheduler"
Schedulers: 
  noop      # noop elevator does nothing. Turns a disk queue in to a FIFO. Select when back-end storage device can also reorder and merge request. Default inside VMs. Useful for devices suchs as SSDs that respond more quickly to request than they are likely to arrive.
  deadline  # groups queued I/O requests together into a read/write batches. Tries to provide a guaranteed latency for requests and prioritizes read requests over writes. Ceph choice for SATA and SAS drives.
  cfq       # Completely Fair Queueing. Multiple I/O classes and priorities to admin can prioritize process ovetr others when it comes to disk access. Handled by ionice command. 
  blk-mq    # Designed for spinning drives. Designed to handle storage with latenfcies of microseconds and missions of IOPS and large internal paralellism. 

osd_mkfs_options_xfs -f -i  size=2048
use noatime,largeio,inode64,swalloc

Design scaling

No more than six OSD journals per SATA SSD device.
No more than 12 OSD journals per NVMe device.

Warning: When an SSD or NVMe device used ot a host joiurnal fails, every OSD using it to host its journal also becomes unavailable.

jeudi, septembre 30 2021

Powershell : avoir le numéro de serie du pc

la ou sous linux, dmidecode nous aide, sous windows, nous lancons un powershell et tapons la commande

wmic bios get serialnumber

vendredi, septembre 17 2021

AWS : controler ses coûts

Votre .aws/config et .aws/credentials dument remplis, vous pouvez connaitre vos couts pour une période avec la commande :

aws ce get-cost-and-usage --metrics UsageQuantity --granularity DAILY --time-period '{"Start":"2021-09-25","End":"2021-09-27"}' 

mais seulement si votre compte aws le permet ;)

lundi, août 23 2021

Filtres logstash

Dans la centralisation des logs, il faut parfois améliorer ou purger des logs reçus. En exemple ici un livecheck de docker qui fait des requêtes toutes les secondes, et des messages qui contiennent un mot clef permettant d'identifier sa source

  if "GET /index.php" in [message]  and "400" in [message] and "127.0.0.1" in [message]
  {
    drop { percentage => 95 }
  } 

et

  if "billy" in [message] 
  {
    mutate {
      add_field => { "shortHostname" => "komatsu" }
    }
  }

vendredi, août 6 2021

GPG : Transférer ses clefs d'un ordinateur à un autre

gpg --export --armor pascal.valois@free.fr > ~/cle-publique.asc
gpg --export-secret-keys --armor --output cle-privee.asc

scp *.asc target: 
ssh target 

gpg --import ~/cle-publique.asc 
gpg --import ~/cle-privee.asc 

jeudi, août 5 2021

Centos c'est pas ubuntu

Pour utiliser certains outils sur une centos 8 en mode serveur, il faut vraiment installer tout plein de choses pour pouvoir faire quoi que ce soit ....

pour installer docker, il faut installer le depot qui demande la commande yum-config-mamanger, et qui demande le paquet "yum-utils" puis suivre les installation du site officiel de docker ...

mardi, août 3 2021

Git: effacer un commit malheureux

Pour annuler le dernier commit (si commit accidentel ou mal fait)

  • git reset --soft HEAD~1
  • git push -f

Cela annule le dernier commit, et vous permet de reprendre votre travail proprement.

jeudi, juillet 29 2021

Apt : empchécher la maj d'un paquet

Pour empécher un paquet de se mettre à jour, vous pouvez l'épingler (pin package version), et cela se fait dans le fichier de préférences d'apt.

Une méthode plus simple est le marquage de paquet :

$ apt-mark hold elasticsearch kibana
elasticsearch passé en figé (« hold »).
kibana passé en figé (« hold »).

Ces paquets ne seront plus impacté par les upgrade. Pour les dégeler, on utilisera apt-mark unhold

lundi, juillet 26 2021

Ansible coding rules

  • All YAML files named with .yml extension
  • Use 2 (two) spaces for each indent
  • Use spaces around jinja variables (eg. var , not var)
  • Variables that are internal to the role should be lowercase
  • Keep roles self-contained. Roles should avoid including tasks from other roles whenever possible
  • Plays should do nothing more than include a list of roles except where pre_tasks and post_tasks are required
  • Use underscores as separators instead of dashes (e.g. my_role, not my-role)
  • When defining paths (or concatenating them), do not include trailing slashes (e.g. my_path: /foo not my_path: /foo/, or my_path /bar not my_path bar)
  • For variables that don't need to change or be overridden by the user, put them in vars/. For variables that would likely be overriden, put them in defaults/.

mardi, juillet 13 2021

Agile, Git, Naming

Branch naming

Create a branch by following the naming convention: <type>/<taskid>-<description-of-branch>.

<type> is:

  • feat - for new code (features, functionalities, etc.)
  • fix - for code updates (issue fixing, improvements)
  • delete - for deletion, removal, undoing of code
  • docs - for documentation
  • test - for code testing. NEVER merged these branches to master.

<taskid> is the ID of the work-item created previously.

<description-of-branch> describes what is accomplished on the branch. Use maximum 3 words, all lowercase, words separated by hyphens.

Examples

  • docs/1-remove-repository
  • feat/5-add-motd-task
  • fix/42-rename-workload-subscription

Conventional commit messages

Use conventional commit message when commiting changes to a branch: <type>: <description>

<type> is:

  • feat - for new code developments
  • fix - for fixes and improvements
  • delete - for permanent deletion of code
  • docs - documentation only changes
  • style - update formatting (white-spaces, indentation, etc.)

Examples

  • feat: add task to define motd on the node
  • fix: change published port used by container from 22 to 4444
  • docs: update section getting-started with contribute details in project readme
  • style: delete all trailing spaces in terraform files

Pull request

Choose two branches to see what’s changed or to start a new pull request

  • source: <name-of-your-branch>
  • into: master (always)

Use a descriptive title to explain what the PR addresses.

Examples

  • add doc about azure naming conventions to wiki
  • deploy storage account for tfstate on production subscription
  • refactor code for ansible role bootstrapping a linux virtual machine

The PR description contains a human-readable description of what changes are addressed with the PR. It aims at assisting the reviewers that are reading the PR. Each lines are less than 100 characters. All lower case. Indicate the related task (with prefix fixed or related), and the related user-story (with prefix related).

Examples

  • fixed: #1
  • related: #3

add description of naming conventions used for every resource deployed on azure with infrastructure-as-code

vendredi, juillet 2 2021

Docker, logstash et discrimination

J'ai enfin écrit une configuration de docker qui me donne un résultat intéressant dans elasticsearch :

{
  "log-driver": "syslog",
  "log-opts":{
     "syslog-facility":"local6"
  },
  "live-restore": true,
  "metrics-addr" : "0.0.0.0:9323",
  "experimental" : true
}

Grace à cette configuration les logs des containers sont gratifié de la facility local6, et transittent par le syslog local. En paramétrant ce syslog avec la template json qu'il faut, et l'envoi a logstash, les logs seront envoyé a ES, et filtrable par la facilité. Mieux encore, il serait surement possible de passer par les mutate de logstash pour faire d'autres transformation, sur la simple reconnaissance de la facility.

jeudi, juin 24 2021

Routage forcé

Les routes sous linux, c'est pas toujours simple, surtout dans des réseaux compliqués. C'est vrai que pour ca, j'aurant tendance a vouloir une boite noir qui fait ca en amont, mais ce sera un projet futur ...

En attendant, mon problème était le suivant. Professionnellement, j'ai un openvpn établi. Mais personnellement, j'ai un ssh entrant.

Le pb c'est que de l'interne, ssh fonctionne bien, mais depuis la 3G/4G, le ssh échouait si le vpn était établi.

Un tcpdump m'a montré que les requêtes arrivaient bien, mais que les réponses partaient dans tun0 !!!

Il a donc fallut ajouter une table de routage spécifique, mais heureusement simple, ne nécessitant pas de tagguer les paquets avec iptables :


echo 200 isp2 >> /etc/iproute2/rt_tables

ip rule add from 192.168.1.11 table isp2 prio 1
ip route add default via 192.168.1.254 dev wlx1cbfced18846 table isp2

Les paquets reçus avec comme ip destination 192.168.1.11 sont automatiquement affecté a la table de routage isp2 (si je comprends bien), et la règlè suivante fait que les paquets de la table isp2 sont routés par défaut vers la box internet.

Donc si j'ai bien compris tant mieux, et surtout l'important c'est que ca marche. le vpn n'est pas cassé ! le ssh fonctionne ! Tout semple ok !

jeudi, juin 17 2021

Ansible, erreurs, verbosité ... ARA

Ansible est un outil génial, mais qui n'est pas non plus dépouvu de coquilles.

L'une des pires, est la transposition de stdout et stderr de la tâche exécutée sur le client, lors d'une remontée d'erreur. On obtient un paté ou les "\n" sont littéraux et cela donne une bouillie infame/.

Un truc connu, est de passer sa commande ansible dans un echo \-ne comme suit :

echo -ne "$(ansible-playbook .... )"

Mais cela reste pénible de toujours surcharger l'appel à ansible ainsi.

Récemment j'ai trouvé Ara, un outil génial qui se place en CALLBACK d'ansible, mais extrait tout une sommes de choses pertinentes ....

Et commencez a jouer :

pip3 install "ara[server]"
export ANSIBLE_CALLBACK_PLUGINS="$(python3 -m ara.setup.callback_plugins)"

ansible-playbook playbook.yaml

ara playbook list

Et pour la suite allez voir la doc :)

vendredi, juin 11 2021

Tester un port avec Powershell

PS C:\Users\admin> Test-NetConnection smtp.office365.com -Port 587 -InformationLevel "Detailed"


ComputerName            : smtp.office365.com
RemoteAddress           : 52.97.150.2
RemotePort              : 587
NameResolutionResults   : 52.97.150.2
                          52.98.175.18
                          40.101.138.2
                          52.97.201.34
MatchingIPsecRules      :
NetworkIsolationContext : Internet
IsAdmin                 : False
InterfaceAlias          : Ethernet0
SourceAddress           : 192.168.2.190
NetRoute (NextHop)      : 192.168.2.101
TcpTestSucceeded        : True

jeudi, juin 10 2021

Exécuter une commande sur tous les hotes avec ansible (pour debugger par exemple)

> ansible -m shell -a "host google.fr" all

proxy | CHANGED | rc=0 >>
google.fr has address 172.217.19.227
google.fr has IPv6 address 2a00:1450:4007:80c::2003
google.fr mail is handled by 30 alt2.aspmx.l.google.com.
google.fr mail is handled by 10 aspmx.l.google.com.
google.fr mail is handled by 40 alt3.aspmx.l.google.com.
google.fr mail is handled by 50 alt4.aspmx.l.google.com.
google.fr mail is handled by 20 alt1.aspmx.l.google.com.

openvas| CHANGED | rc=0 >>
google.fr has address 172.217.19.227
google.fr has IPv6 address 2a00:1450:4007:80c::2003
google.fr mail is handled by 40 alt3.aspmx.l.google.com.
google.fr mail is handled by 10 aspmx.l.google.com.
google.fr mail is handled by 20 alt1.aspmx.l.google.com.
google.fr mail is handled by 30 alt2.aspmx.l.google.com.
google.fr mail is handled by 50 alt4.aspmx.l.google.com.

nagios | CHANGED | rc=0 >>
google.fr has address 172.217.19.227
google.fr has IPv6 address 2a00:1450:4007:80c::2003
google.fr mail is handled by 30 alt2.aspmx.l.google.com.
google.fr mail is handled by 40 alt3.aspmx.l.google.com.
google.fr mail is handled by 20 alt1.aspmx.l.google.com.
google.fr mail is handled by 50 alt4.aspmx.l.google.com.
google.fr mail is handled by 10 aspmx.l.google.com.

dimanche, mai 16 2021

Créer un dichier DMG sour OSX

En cli, c'est aussi simple que ça :

hdiutil create "ImageName" -srcfolder path/

jeudi, mai 6 2021

Packaging Debian

Pour faire un paquet débian, il faut créer une arborescence qui répond a certaines règles :

timeofday-0.1-1.amd64/
timeofday-0.1-1.amd64/DEBIAN
timeofday-0.1-1.amd64/DEBIAN/postrm
timeofday-0.1-1.amd64/DEBIAN/preinst
timeofday-0.1-1.amd64/DEBIAN/prerm
timeofday-0.1-1.amd64/DEBIAN/control
timeofday-0.1-1.amd64/DEBIAN/postinst
timeofday-0.1-1.amd64/usr
timeofday-0.1-1.amd64/usr/local
timeofday-0.1-1.amd64/usr/local/bin
timeofday-0.1-1.amd64/usr/local/bin/tod

Le nom du package

"timeofday - 0.1 - 1 _ amd64" répond à la nomenclature suivante :

  • nom du programme : timeofday
  • version du programme : 0.1
  • version du packet debian : 1
  • architecture du logicle : amd64

Contenu du dossier DEBIAN

ce dossier est appelé le dossier de contrôle. Il contient un fichier "control" qui décrit le paquet et quelques impératifs :

Package: timeofday
Version: 0.1
Architecture: amd64
Maintainer: Pascal Valois <pascal.valois@free.fr>
Description: A simple program that give you current time and date
Depends: libc6

Les dépendances peuvent inclure une version entre parenthèse, ex (>= 2.16), et sont séparées par des virgules.

Les fichiers preinst, postinst, prerm, et postrm, sont des scripts shell, qui sont exécutés aux moments opportuns des installation et suppressions.

Leurs droits doivent être 0755.

Il est possible d'utiliser des templates de questions d'installation et désinstallation, mais nous n'iront pas jusque la pour ce post.

Autres dossiers

Les autres dossiers sont une architecture LFS standard, ou nous copions les fichiers à inclure dans un paquets, comme ils le seraient dans un tar.

Le dossier "." qui précède cette architecture, sera copié dans le "/" de la machine installé.

Création du package

Une fois tout cela fait, nous pouvons créer un package debiant avec la commande

dpkg-deb --build --root-owner-group timeofday-0.1-1.amd64

dimanche, avril 11 2021

LDAP : openldap2.4 et Size Limit

Dans la continuité du post précédent :

Appliquez ce ldif pour que le serveur puisse répondre jusqu'a 50000 entrées (au lieu des 500 par défaut).

dn: cn=config
changeType: modify
replace: olcSizeLimit
olcSizeLimit: 50000

Les clients ldap peuvent fonctionner par palliers :

ldapsearch -x -h lassie -b "ou=users,dc=pepiniere,dc=fr" -E pr=100/noprompt %%%

Mais cela occasionne plusieurs requêtes au serveur.

L'augmentation de limite elle permet de transférer beaucoup plus, voir tout d'un coup, mais se transforme en consommation mémoire, au profit d'une simplicité plus grande pour l'utilisateur.

jeudi, avril 8 2021

LDAP : openldap2.4 et Log Verbosity

Openldap stocke sa configuration sous forme de ldif internes, ce qui permet une modifications a chaud de ceux-ci, et nécessitant seulement de faire des requêtes ldap pour les lire/modifier :

Obtenir le niveau de logs actuel

Sur l'hôte qui exécute openldap, exécuter :

sudo ldapsearch -Y external -H ldapi:/// -b cn=config "(objectClass=olcGlobal)" olcLogLevel

Passer le logs au niveau "stats"

Créer le fichier log-stats.ldif content :

dn: cn=config
changeType: modify
replace: olcLogLevel
olcLogLevel: stats

et appliquez le comme suit :

sudo ldapmodify -Y external -H ldapi:/// -f log-stats.ldif

Et voila, vous pouvez maintenant tracer les requêtes faites à votre serveur ldap pour voir l'usage qu'il en est fait !

vendredi, avril 2 2021

Jenkins : updater jenkins dans l'image docker

Jenkins étant une application java, son update dans docker se fait par remplacement du war :

Se connecter root au container :

docker -u 0 -t -i jenkins bash

Télécharger l'image war

sur http://updates.jenkins-ci.org/download/war/, faire un wget de la dernière image. puis :

mv ./jenkins.war /usr/share/jenkins

Relancer le container

docker restart jenkins

Vous pouvez bien sur contrôler les logs pour voir que tout s'est bien passé !

Nmcli : configurer une ip manuelle

pour ajouter une ip statique manuelle en ligne de commande avec network manager, il faut passer par nmclin :

sudo nmcli con edit type ethernet con-name eth0

puis taper les commandes :

set ipv4.addresses 192.168.122.88/24
set ipv4.method manual
save
quit

et voila, le setting est permanent !

vendredi, mars 26 2021

Hp Procurve

J'ai recu mon hp procurve gigabit, et me remet en tête les bases :

configuration initiale

configurer minicom pour utilier ttyusb0 et lancer en tant que root. il toruvera le switch a 9600 bauds.

il n'y a par défaut pas d'authentification sur le port console.

Pour configuer l'ip sur un port (qui sera le port d'interco), nous faisons comme ceci :

enable
conf txt
interface eth 1
ip address 10.0.0.1/255.0.0.0
exit
exit
save

ensuite pour valider on reboot ;)

Par défaut, telnet est actif. Vous pouvez donc maintenant vous connecter par telnet et procéder aux opérations initiales de sécurisation :

  • activation ssh
  • activation clef-publique
  • positionnement des mots de passe console
  • desactiver telnet

C'est un minima à faire ... on pourrait aussi parler de radius pour les comptes, d'un filtrage ip pour le login ssh, ...

lundi, mars 15 2021

Python : supprimer l'output standard d'un bloc de code

Voici une facon de supprimer l'output de certains blocs en python, avec la notion de context manager, et l'utilisation de with pour limiter la portée de l'action :

from contextlib import contextmanager
import sys, os

@contextmanager
def suppress_stdout():
    with open(os.devnull, "w") as devnull:
        old_stdout = sys.stdout
        sys.stdout = devnull
        try:  
            yield
        finally:
            sys.stdout = old_stdout

Et maintenant, en profitant du context management, nous pouvons supprimer les sorties quand nous le souhaitons :

print("Now you see it")
with suppress_stdout():
    print("Now you don't")

mercredi, mars 10 2021

Curl : décomposer le temps

Souvent lors d'une lenteur de résultat web, ce n'est pas forcément votre connexion internet qui est coupable.

Une page web se demande, se prépare, se restitue, s'affiche, et chacune de ses tâches prends du temps.

Pour avoir le détail du temps de traitement d'une page, nous pouvons utiliser des fonctions avancées de curl, comme le formatage d'output.

Préparation du format d'output

cat output.txt

 time_namelookup:  %{time_namelookup}s\n
 time_connect:  %{time_connect}s\n
 time_appconnect:  %{time_appconnect}s\n
 time_pretransfer:  %{time_pretransfer}s\n
 time_redirect:  %{time_redirect}s\n
 time_starttransfer:  %{time_starttransfer}s\n
               ----------\n
 time_total:  %{time_total}s\n

Utilisation de ce fichier

curl -w "@format.txt" -o /dev/null -s http://www.google.com/


 time_namelookup:  2440s
 time_connect:  86096s
 time_appconnect:  0s
 time_pretransfer:  86169s
 time_redirect:  0s
 time_starttransfer:  201362s
                ----------
 time_total:  201463s

Et voila !

curl-format.txt

Et voici un fichier de formatage assez complet pour l'information sur les statistiques d'une page web

=== HEAD\n
       http_version: %{http_version}\n
          http_code: %{http_code}\n
      num_redirects: %{num_redirects} (nombre de redirections)\n
      url_effective: %{url_effective} (denière URL utilisée (si redirection))\n
 === TIMING\n
    time_namelookup:  %{time_namelookup} (temps écoulé pour la résolution DNS)\n
       time_connect:  %{time_connect} (temps écoulé depuis le début jusqu'à la connexion TCP à l'hôte distant)\n
    time_appconnect:  %{time_appconnect} (temps écoulé jusqu'à la connexion, pour le protocole applicatif utilisé (https par exemple))\n
   time_pretransfer:  %{time_pretransfer} (temps écoulé jusqu'avant que la réponse soit envoyée par le serveur)\n
      time_redirect:  %{time_redirect} (temps écoulé depuis le début par toutes les redirections)\n
 time_starttransfer:  %{time_starttransfer} (le serveur envoie son premier octet)\n
 === STATS\n
     speed_download:  %{speed_download}B/s (Vitesse de téléchargement moyenne)\n
       speed_upload:  %{speed_upload}B/s (Vitesse de téléversement moyenne)\n
                    ----------\n
         time_total:  %{time_total}\n

mardi, mars 9 2021

Donner un accès rapide à un dossier via http (Quick and Dirty)

python3 -m http.server 8000

Python créera un serveur web dont la racine est le répertoire courant et servira l'arborescence, ce qui permet de télécharger des fichiers et de tuer ce micro serveur dans la foulée.

dimanche, février 21 2021

Github : publication via ssh

Pour publier ses modifications via ssh (et utiliser un combo pki pour l'authentification), il suffit d'ajouter ses clefs ssh via l'interface de github (dans les préférences du compte), et de changer l'origine de votre dépot comme suit :

git remote set-url origin git@github.com:pvalois/security

après cela, la publication se fait naturellement en ssh sur mon compte pvalois, repo security

vendredi, février 12 2021

Nommer et renommer une session Screen

screen est un émulateur de terminal très utile pour garder une session détachée et rattachable à la volée.

De plus lors d'un accès via ssh, la fin de connexion détache automatiquement le screen, ce qui fait que l'on peut se reconnecter, rattacher la session, et reprendre ou nous en étions.

Cependant, screen nomme ses sessions "ésotériquement" :

{pid}-{pts}-{hostname}

Pour lancer une sesson avec un nom particulier, nous utilisons l'option -S :

screen -S foobar

Pour renommer une session, il faut préciser la session à renommer et le nouveau nom :

screen -S {pid} -X sessionname foobars

Linux : screen black ... debukking

Parfois, il peut arriver que l'écran soit noir ... Plusieurs problèmes peuvent en être la cause :

  • mauvaise résolution
  • mauvaise fréquence
  • écran désactivé matériellement
  • écran desactivé logiciellement

Pour ca il faut donc avoir un maximum d'information permettant de trouver la cause (comme dans toute root cause analysis)

Lister les écrans hardware

sudo lshw -c display

Extended Display Identification Data

sudo apt install read-edid
sudo get-edid | parse-edid

Informations X11

xrandr --prop

via /sys et Edid

find /sys/devices -name "edid"
cat /sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-eDP-1/edid | edid-decode

Solution

Rien de tout ce que je voyais ne m'expliquait l'écran noir. Surtout que le problème se posait au démarrage de X11 et pas avant. La solution, au final, fut de rajouter "nomodeset" aux options de grub, puis faire un updage-grub. Après tout ça, retour à la normal de l'affichage.

vendredi, janvier 29 2021

Docker : one line killer for all exited container

docker ps --filter status=exited | awk '{if (NR>1) print $1}' | xargs docker rm

- page 2 de 12 -