From 4436c1300415a6718c8d05f727208f6c6ed241f7 Mon Sep 17 00:00:00 2001 From: Jeremy Lecour Date: Thu, 29 Dec 2016 11:25:39 +0100 Subject: [PATCH] Import automatique du Trac --- BaieTranstec/PROVIGO.md | 6 + CarteAPU.md | 90 + CarteRAID.md | 31 + CloudOVH.md | 17 + FreeBSD.md | 74 + HowToRedmine-Source.md | 202 +++ HowToRedmine-Source/BDD/MySQL.md | 36 + HowToRedmine-Source/Delete.md | 42 + HowToRedmine-Source/Migrate.md | 47 + HowToRedmine-Source/Plugins.md | 43 + .../Plugins/Redmine_git_hosting.md | 116 ++ .../Plugins/Redmine_multiprojects_issue.md | 18 + .../Plugins/Redmine_wiki_notes.md | 16 + HowToRedmine-Source/Rails/Puma.md | 66 + HowToRedmine-Source/Save.md | 23 + HowToRedmine-Source/Update.md | 77 + HowToRedmine-Source/Web/Nginx.md | 82 + HowToSFTP.md | 7 + HowtoACL.md | 32 + HowtoAlfresco.md | 105 ++ HowtoAnsible.md | 800 +++++++++ HowtoAsterisk.md | 207 +++ HowtoAtom.md | 7 + HowtoBNX2.md | 14 + HowtoBTRFS.md | 74 + HowtoBash.md | 28 + HowtoBenchmarks.md | 196 +++ HowtoBind.md | 469 ++++++ HowtoBogofilter.md | 44 + HowtoBuildRPM.md | 306 ++++ HowtoCUPS.md | 120 ++ HowtoCacheHTTP.md | 35 + HowtoCacti.md | 19 + HowtoCentOS/Installation.md | 26 + HowtoCentOS/Reseau.md | 40 + HowtoChiffrementData.md | 133 ++ HowtoCompression.md | 30 + HowtoCron.md | 16 + HowtoCrontab.md | 45 + HowtoCumulus.md | 473 ++++++ HowtoDHCP.md | 80 + HowtoDUC.md | 80 + HowtoDebian/Backports.md | 81 + HowtoDebian/Download.md | 32 + HowtoDebian/Install.md | 300 ++++ HowtoDebian/MigrationLennySqueeze.md | 378 +++++ HowtoDebian/MigrationSqueezeLTS.md | 16 + HowtoDebian/MigrationSqueezeWheezy.md | 443 +++++ HowtoDebian/MigrationWheezyJessie.md | 320 ++++ HowtoDebian/Packages.md | 137 ++ HowtoDebian/Passwd.md | 11 + HowtoDebian/Repository.md | 189 +++ HowtoDebian/Reseau.md | 187 +++ HowtoDebian/Squeeze.md | 21 + HowtoDebian/liveCD.md | 98 ++ HowtoDiscourse.md | 87 + HowtoDjango.md | 341 ++++ HowtoDovecot.md | 338 ++++ HowtoEXT3.md | 5 + HowtoEchoping.md | 10 + HowtoEjabberd.md | 139 ++ HowtoEtherpad.md | 141 ++ HowtoEthtool.md | 51 + HowtoFAI.md | 483 ++++++ HowtoFMS.md | 20 + HowtoFail2Ban.md | 391 +++++ HowtoFetchmail.md | 33 + HowtoFreeradius.md | 7 + HowtoGNS3.md | 2 + HowtoGParted.md | 86 + HowtoGPhoto.md | 17 + HowtoGRSEC.md | 23 + HowtoGaneti.md | 40 + HowtoGearman.md | 43 + HowtoGeoIP.md | 35 + HowtoGit/Github.md | 17 + HowtoGitDaemon.md | 48 + HowtoGitLab.md | 32 + HowtoGitWeb.md | 76 + HowtoGlassFish.md | 117 ++ HowtoGratuitousARP.md | 23 + HowtoHDPARM.md | 177 ++ HowtoHG.md | 165 ++ HowtoHearthbeat.md | 255 +++ HowtoHtop.md | 18 + HowtoIPMI.md | 185 +++ HowtoIPTables.md | 47 + HowtoISAKMPD.md | 231 +++ HowtoISCSI.md | 346 ++++ HowtoIcinga2.md | 356 ++++ HowtoInitramfsDebug.md | 52 + HowtoIrssi.md | 57 + HowtoJava.md | 113 ++ HowtoJenkins.md | 55 + HowtoKVM/OpenBSD.md | 48 + HowtoKVM/Ubuntu.md | 29 + HowtoKeepalived.md | 11 + HowtoKernelTuning.md | 2 + HowtoLAMP.md | 18 + HowtoLAMP/AwStats.md | 95 ++ HowtoLAMP/IonCube.md | 42 + HowtoLAMP/MySQL.md | 31 + HowtoLAMP/PHP.md | 317 ++++ HowtoLAMP/PHP/Debug-Analyse-Performance.md | 48 + HowtoLAMP/PHP/HHVM.md | 61 + HowtoLAMP/PHP/coredump.md | 63 + HowtoLAMP/PHP/xdebug.md | 42 + HowtoLAMP/Performances.md | 91 + HowtoLAMP/Postfix.md | 71 + HowtoLAMP/Squid.md | 145 ++ HowtoLFTP.md | 17 + HowtoLXC.md | 93 ++ HowtoLetsEncrypt.md | 82 + HowtoLibreOffice.md | 24 + HowtoLiveCD.md | 117 ++ HowtoLog2mail.md | 94 ++ HowtoLogcheck.md | 71 + HowtoLogrotate.md | 42 + HowtoLsyncd.md | 42 + HowtoMHonArc.md | 12 + HowtoMail/Amavis.md | 147 ++ HowtoMail/Antispam.md | 786 +++++++++ HowtoMail/DKIM.md | 214 +++ HowtoMail/Horde.md | 59 + HowtoMail/Introduction.md | 149 ++ HowtoMail/Mailgraph.md | 55 + HowtoMail/Postfix.md | 942 +++++++++++ HowtoMail/Roundcube.md | 51 + HowtoMail/Sendmail.md | 36 + HowtoMail/SpamAssassin.md | 49 + HowtoMailman.md | 89 + HowtoMemcached.md | 199 +++ HowtoMnogosearch.md | 34 + HowtoMongoDB.md | 823 +++++++++ HowtoNBD.md | 34 + HowtoNFS.md | 44 + HowtoNTP.md | 100 ++ HowtoNeo4j.md | 53 + HowtoNetflow.md | 66 + HowtoNetworkTuning.md | 59 + HowtoNginx-PHP-FPM.md | 59 + HowtoNginx-Proxy-POP-IMAP.md | 5 + HowtoNginx.md | 286 ++++ HowtoNodeJS.md | 52 + HowtoOpenBSD/CARP.md | 124 ++ HowtoOpenBSD/GestionDisques.md | 198 +++ HowtoOpenBSD/Netflow.md | 34 + HowtoOpenBSD/OSPF.md | 265 +++ HowtoOpenBSD/PFSYNC.md | 28 + HowtoOpenBSD/PFStat.md | 68 + HowtoOpenBSD/PacketFilter.md | 55 + HowtoOpenBSD/ProxyFTP.md | 17 + HowtoOpenBSD/RAID1.md | 89 + HowtoOpenBSD/Reseau.md | 262 +++ HowtoOpenBSD/Unbound.md | 43 + HowtoOpenBSD/Upgrade46.md | 11 + HowtoOpenBSD/VLAN.md | 38 + HowtoOpenBSD/VRF-rtable-rdomain.md | 128 ++ HowtoOpenLDAP.md | 345 ++++ HowtoOpenNMS.md | 88 + HowtoOpenSearchServer.md | 37 + HowtoOpenVZ.md | 206 +++ HowtoOpenfire.md | 19 + HowtoOracleDB.md | 210 +++ HowtoOutlook.md | 9 + HowtoOwncloud.md | 83 + HowtoPDFTK.md | 16 + HowtoPFSTAT.md | 68 + HowtoPXE.md | 59 + HowtoParted.md | 94 ++ HowtoPgBouncer.md | 94 ++ HowtoPhilesight.md | 29 + HowtoPortKnocking.md | 127 ++ HowtoPostgreSQLReplication.md | 520 ++++++ HowtoPostgreSQLStreamingReplication.md | 209 +++ HowtoPowerVault.md | 2 + HowtoPrestashop.md | 55 + HowtoProFTPD.md | 173 ++ HowtoPulseAudio.md | 18 + HowtoPuppet.md | 162 ++ HowtoPureFTPD.md | 17 + HowtoQmail.md | 30 + HowtoQuagga.md | 191 +++ HowtoQuota.md | 38 + HowtoRails.md | 320 ++++ HowtoRaspberryPi.md | 51 + HowtoRedis.md | 356 ++++ HowtoRedmineGitHosting.md | 52 + HowtoRsync.md | 19 + HowtoRsyslog.md | 26 + HowtoSNMP.md | 154 ++ HowtoSQLite.md | 21 + HowtoSSH.md | 113 ++ HowtoSVN.md | 138 ++ HowtoSamba.md | 265 +++ HowtoSfdisk.md | 53 + HowtoShareDance.md | 212 +++ HowtoShell.md | 41 + HowtoShorewall.md | 78 + HowtoSmokeping.md | 65 + HowtoSolr.md | 64 + HowtoSquid/Proxy.md | 208 +++ HowtoSquid/ReverseProxy.md | 128 ++ HowtoStrongSwan.md | 80 + HowtoSudo.md | 26 + HowtoSupervisor.md | 26 + HowtoSympa.md | 32 + HowtoTFTPD.md | 15 + HowtoTerraform.md | 6 + HowtoTokyoTyrant.md | 78 + HowtoTomcat.md | 405 +++++ HowtoTrac.md | 8 + HowtoTsung.md | 82 + HowtoTypo3.md | 46 + HowtoUniFo.md | 79 + HowtoUnicorn.md | 112 ++ HowtoVRRP.md | 72 + HowtoVagrant.md | 90 + HowtoVirtualBox.md | 84 + HowtoWindows.md | 9 + HowtoWkhtmltopdf.md | 42 + HowtoWordpress.md | 147 ++ HowtoXen.md | 137 ++ HowtoXrandr.md | 18 + HowtoYUM.md | 31 + HowtoZFS.md | 253 +++ HowtoZimbra.md | 1475 +++++++++++++++++ HowtoZimbra/Android.md | 8 + HowtoZimbra/PocketPC.md | 14 + HowtoZram.md | 28 + Howtoansible/Guidelines.md | 12 + Howtonfdump.md | 44 + HowtophpMyAdmin.md | 73 + Infortrend-DS-S12E-G2140-4.md | 81 + InfosMegaCLI.md | 132 ++ LSI-SAS1068E.md | 35 + LSI.md | 68 + NetApp.md | 495 ++++++ OpenBSD.md | 22 + OpenIndiana.md | 2 + PowerVault.md | 54 + RAIDAAC.md | 3 + RAIDAdaptecSeries7.md | 21 + ServeurAmazonEC2.md | 217 +++ ServeurDELL.md | 44 + ServeurDELL/PERC.md | 325 ++++ ServeurDedibox.md | 340 ++++ ServeurGANDI.md | 225 +++ ServeurGoogleCloud.md | 87 + ServeurHP.md | 31 + ServeurHP/RAID.md | 89 + ServeurHyperV.md | 9 + ServeurIBM.md | 67 + ServeurIBM/RAID.md | 42 + ServeurOVH.md | 202 +++ ServeurOVH/vKVM.md | 27 + ServeurOrangeFCE.md | 140 ++ ServeurVMware.md | 618 +++++++ Solaris.md | 167 ++ Subuids.md | 54 + SwitchCisco.md | 876 ++++++++++ SwitchNetgear.md | 54 + TipsAndroid.md | 224 +++ TipsDelivrabilite.md | 12 + TipsDevPHP.md | 17 + TipsDevWeb.md | 84 + TipsExtfs.md | 11 + TipsWindows.md | 93 ++ 268 files changed, 32469 insertions(+) create mode 100644 BaieTranstec/PROVIGO.md create mode 100644 CarteAPU.md create mode 100644 CarteRAID.md create mode 100644 CloudOVH.md create mode 100644 FreeBSD.md create mode 100644 HowToRedmine-Source.md create mode 100644 HowToRedmine-Source/BDD/MySQL.md create mode 100644 HowToRedmine-Source/Delete.md create mode 100644 HowToRedmine-Source/Migrate.md create mode 100644 HowToRedmine-Source/Plugins.md create mode 100644 HowToRedmine-Source/Plugins/Redmine_git_hosting.md create mode 100644 HowToRedmine-Source/Plugins/Redmine_multiprojects_issue.md create mode 100644 HowToRedmine-Source/Plugins/Redmine_wiki_notes.md create mode 100644 HowToRedmine-Source/Rails/Puma.md create mode 100644 HowToRedmine-Source/Save.md create mode 100644 HowToRedmine-Source/Update.md create mode 100644 HowToRedmine-Source/Web/Nginx.md create mode 100644 HowToSFTP.md create mode 100644 HowtoACL.md create mode 100644 HowtoAlfresco.md create mode 100644 HowtoAnsible.md create mode 100644 HowtoAsterisk.md create mode 100644 HowtoAtom.md create mode 100644 HowtoBNX2.md create mode 100644 HowtoBTRFS.md create mode 100644 HowtoBash.md create mode 100644 HowtoBenchmarks.md create mode 100644 HowtoBind.md create mode 100644 HowtoBogofilter.md create mode 100644 HowtoBuildRPM.md create mode 100644 HowtoCUPS.md create mode 100644 HowtoCacheHTTP.md create mode 100644 HowtoCacti.md create mode 100644 HowtoCentOS/Installation.md create mode 100644 HowtoCentOS/Reseau.md create mode 100644 HowtoChiffrementData.md create mode 100644 HowtoCompression.md create mode 100644 HowtoCron.md create mode 100644 HowtoCrontab.md create mode 100644 HowtoCumulus.md create mode 100644 HowtoDHCP.md create mode 100644 HowtoDUC.md create mode 100644 HowtoDebian/Backports.md create mode 100644 HowtoDebian/Download.md create mode 100644 HowtoDebian/Install.md create mode 100644 HowtoDebian/MigrationLennySqueeze.md create mode 100644 HowtoDebian/MigrationSqueezeLTS.md create mode 100644 HowtoDebian/MigrationSqueezeWheezy.md create mode 100644 HowtoDebian/MigrationWheezyJessie.md create mode 100644 HowtoDebian/Packages.md create mode 100644 HowtoDebian/Passwd.md create mode 100644 HowtoDebian/Repository.md create mode 100644 HowtoDebian/Reseau.md create mode 100644 HowtoDebian/Squeeze.md create mode 100644 HowtoDebian/liveCD.md create mode 100644 HowtoDiscourse.md create mode 100644 HowtoDjango.md create mode 100644 HowtoDovecot.md create mode 100644 HowtoEXT3.md create mode 100644 HowtoEchoping.md create mode 100644 HowtoEjabberd.md create mode 100644 HowtoEtherpad.md create mode 100644 HowtoEthtool.md create mode 100644 HowtoFAI.md create mode 100644 HowtoFMS.md create mode 100644 HowtoFail2Ban.md create mode 100644 HowtoFetchmail.md create mode 100644 HowtoFreeradius.md create mode 100644 HowtoGNS3.md create mode 100644 HowtoGParted.md create mode 100644 HowtoGPhoto.md create mode 100644 HowtoGRSEC.md create mode 100644 HowtoGaneti.md create mode 100644 HowtoGearman.md create mode 100644 HowtoGeoIP.md create mode 100644 HowtoGit/Github.md create mode 100644 HowtoGitDaemon.md create mode 100644 HowtoGitLab.md create mode 100644 HowtoGitWeb.md create mode 100644 HowtoGlassFish.md create mode 100644 HowtoGratuitousARP.md create mode 100644 HowtoHDPARM.md create mode 100644 HowtoHG.md create mode 100644 HowtoHearthbeat.md create mode 100644 HowtoHtop.md create mode 100644 HowtoIPMI.md create mode 100644 HowtoIPTables.md create mode 100644 HowtoISAKMPD.md create mode 100644 HowtoISCSI.md create mode 100644 HowtoIcinga2.md create mode 100644 HowtoInitramfsDebug.md create mode 100644 HowtoIrssi.md create mode 100644 HowtoJava.md create mode 100644 HowtoJenkins.md create mode 100644 HowtoKVM/OpenBSD.md create mode 100644 HowtoKVM/Ubuntu.md create mode 100644 HowtoKeepalived.md create mode 100644 HowtoKernelTuning.md create mode 100644 HowtoLAMP.md create mode 100644 HowtoLAMP/AwStats.md create mode 100644 HowtoLAMP/IonCube.md create mode 100644 HowtoLAMP/MySQL.md create mode 100644 HowtoLAMP/PHP.md create mode 100644 HowtoLAMP/PHP/Debug-Analyse-Performance.md create mode 100644 HowtoLAMP/PHP/HHVM.md create mode 100644 HowtoLAMP/PHP/coredump.md create mode 100644 HowtoLAMP/PHP/xdebug.md create mode 100644 HowtoLAMP/Performances.md create mode 100644 HowtoLAMP/Postfix.md create mode 100644 HowtoLAMP/Squid.md create mode 100644 HowtoLFTP.md create mode 100644 HowtoLXC.md create mode 100644 HowtoLetsEncrypt.md create mode 100644 HowtoLibreOffice.md create mode 100644 HowtoLiveCD.md create mode 100644 HowtoLog2mail.md create mode 100644 HowtoLogcheck.md create mode 100644 HowtoLogrotate.md create mode 100644 HowtoLsyncd.md create mode 100644 HowtoMHonArc.md create mode 100644 HowtoMail/Amavis.md create mode 100644 HowtoMail/Antispam.md create mode 100644 HowtoMail/DKIM.md create mode 100644 HowtoMail/Horde.md create mode 100644 HowtoMail/Introduction.md create mode 100644 HowtoMail/Mailgraph.md create mode 100644 HowtoMail/Postfix.md create mode 100644 HowtoMail/Roundcube.md create mode 100644 HowtoMail/Sendmail.md create mode 100644 HowtoMail/SpamAssassin.md create mode 100644 HowtoMailman.md create mode 100644 HowtoMemcached.md create mode 100644 HowtoMnogosearch.md create mode 100644 HowtoMongoDB.md create mode 100644 HowtoNBD.md create mode 100644 HowtoNFS.md create mode 100644 HowtoNTP.md create mode 100644 HowtoNeo4j.md create mode 100644 HowtoNetflow.md create mode 100644 HowtoNetworkTuning.md create mode 100644 HowtoNginx-PHP-FPM.md create mode 100644 HowtoNginx-Proxy-POP-IMAP.md create mode 100644 HowtoNginx.md create mode 100644 HowtoNodeJS.md create mode 100644 HowtoOpenBSD/CARP.md create mode 100644 HowtoOpenBSD/GestionDisques.md create mode 100644 HowtoOpenBSD/Netflow.md create mode 100644 HowtoOpenBSD/OSPF.md create mode 100644 HowtoOpenBSD/PFSYNC.md create mode 100644 HowtoOpenBSD/PFStat.md create mode 100644 HowtoOpenBSD/PacketFilter.md create mode 100644 HowtoOpenBSD/ProxyFTP.md create mode 100644 HowtoOpenBSD/RAID1.md create mode 100644 HowtoOpenBSD/Reseau.md create mode 100644 HowtoOpenBSD/Unbound.md create mode 100644 HowtoOpenBSD/Upgrade46.md create mode 100644 HowtoOpenBSD/VLAN.md create mode 100644 HowtoOpenBSD/VRF-rtable-rdomain.md create mode 100644 HowtoOpenLDAP.md create mode 100644 HowtoOpenNMS.md create mode 100644 HowtoOpenSearchServer.md create mode 100644 HowtoOpenVZ.md create mode 100644 HowtoOpenfire.md create mode 100644 HowtoOracleDB.md create mode 100644 HowtoOutlook.md create mode 100644 HowtoOwncloud.md create mode 100644 HowtoPDFTK.md create mode 100644 HowtoPFSTAT.md create mode 100644 HowtoPXE.md create mode 100644 HowtoParted.md create mode 100644 HowtoPgBouncer.md create mode 100644 HowtoPhilesight.md create mode 100644 HowtoPortKnocking.md create mode 100644 HowtoPostgreSQLReplication.md create mode 100644 HowtoPostgreSQLStreamingReplication.md create mode 100644 HowtoPowerVault.md create mode 100644 HowtoPrestashop.md create mode 100644 HowtoProFTPD.md create mode 100644 HowtoPulseAudio.md create mode 100644 HowtoPuppet.md create mode 100644 HowtoPureFTPD.md create mode 100644 HowtoQmail.md create mode 100644 HowtoQuagga.md create mode 100644 HowtoQuota.md create mode 100644 HowtoRails.md create mode 100644 HowtoRaspberryPi.md create mode 100644 HowtoRedis.md create mode 100644 HowtoRedmineGitHosting.md create mode 100644 HowtoRsync.md create mode 100644 HowtoRsyslog.md create mode 100644 HowtoSNMP.md create mode 100644 HowtoSQLite.md create mode 100644 HowtoSSH.md create mode 100644 HowtoSVN.md create mode 100644 HowtoSamba.md create mode 100644 HowtoSfdisk.md create mode 100644 HowtoShareDance.md create mode 100644 HowtoShell.md create mode 100644 HowtoShorewall.md create mode 100644 HowtoSmokeping.md create mode 100644 HowtoSolr.md create mode 100644 HowtoSquid/Proxy.md create mode 100644 HowtoSquid/ReverseProxy.md create mode 100644 HowtoStrongSwan.md create mode 100644 HowtoSudo.md create mode 100644 HowtoSupervisor.md create mode 100644 HowtoSympa.md create mode 100644 HowtoTFTPD.md create mode 100644 HowtoTerraform.md create mode 100644 HowtoTokyoTyrant.md create mode 100644 HowtoTomcat.md create mode 100644 HowtoTrac.md create mode 100644 HowtoTsung.md create mode 100644 HowtoTypo3.md create mode 100644 HowtoUniFo.md create mode 100644 HowtoUnicorn.md create mode 100644 HowtoVRRP.md create mode 100644 HowtoVagrant.md create mode 100644 HowtoVirtualBox.md create mode 100644 HowtoWindows.md create mode 100644 HowtoWkhtmltopdf.md create mode 100644 HowtoWordpress.md create mode 100644 HowtoXen.md create mode 100644 HowtoXrandr.md create mode 100644 HowtoYUM.md create mode 100644 HowtoZFS.md create mode 100644 HowtoZimbra.md create mode 100644 HowtoZimbra/Android.md create mode 100644 HowtoZimbra/PocketPC.md create mode 100644 HowtoZram.md create mode 100644 Howtoansible/Guidelines.md create mode 100644 Howtonfdump.md create mode 100644 HowtophpMyAdmin.md create mode 100644 Infortrend-DS-S12E-G2140-4.md create mode 100644 InfosMegaCLI.md create mode 100644 LSI-SAS1068E.md create mode 100644 LSI.md create mode 100644 NetApp.md create mode 100644 OpenBSD.md create mode 100644 OpenIndiana.md create mode 100644 PowerVault.md create mode 100644 RAIDAAC.md create mode 100644 RAIDAdaptecSeries7.md create mode 100644 ServeurAmazonEC2.md create mode 100644 ServeurDELL.md create mode 100644 ServeurDELL/PERC.md create mode 100644 ServeurDedibox.md create mode 100644 ServeurGANDI.md create mode 100644 ServeurGoogleCloud.md create mode 100644 ServeurHP.md create mode 100644 ServeurHP/RAID.md create mode 100644 ServeurHyperV.md create mode 100644 ServeurIBM.md create mode 100644 ServeurIBM/RAID.md create mode 100644 ServeurOVH.md create mode 100644 ServeurOVH/vKVM.md create mode 100644 ServeurOrangeFCE.md create mode 100644 ServeurVMware.md create mode 100644 Solaris.md create mode 100644 Subuids.md create mode 100644 SwitchCisco.md create mode 100644 SwitchNetgear.md create mode 100644 TipsAndroid.md create mode 100644 TipsDelivrabilite.md create mode 100644 TipsDevPHP.md create mode 100644 TipsDevWeb.md create mode 100644 TipsWindows.md diff --git a/BaieTranstec/PROVIGO.md b/BaieTranstec/PROVIGO.md new file mode 100644 index 00000000..2912b3f4 --- /dev/null +++ b/BaieTranstec/PROVIGO.md @@ -0,0 +1,6 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Liens utiles + +* [Drivers](http://shop.transtec.fr/F/F/support/support_driverdownload.html) ; +* [Manuel de la baie](http://download.transtec.de/doit/loadva/software/w3/CD_STOR_HTML/raid/pv6xx/docs/GMN_PV610S_SCSI-toSATA_v1.3.pdf). \ No newline at end of file diff --git a/CarteAPU.md b/CarteAPU.md new file mode 100644 index 00000000..02c394bc --- /dev/null +++ b/CarteAPU.md @@ -0,0 +1,90 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto APU + +## minicom + +~~~ +pu port /dev/ttyUSB0 +pu baudrate 38400 +pu rtscts No +pu xonxoff Yes +~~~ + +~~~ +pu port /dev/ttyUSB0 +pu baudrate 115200 +pu rtscts No +pu xonxoff Yes +~~~ + +## Installation flashrd + +Suivre + +## Adaptations de base + +~~~ +rw +passwd +echo 'PKG_PATH="ftp://ftp.openbsd.org/pub/OpenBSD/5.7/packages/amd64/"\nexport PKG_PATH' >> /root/.profile +echo routeur > /etc/myname +echo 'net.inet.ip.forwarding=1\nnet.inet.ip.redirect=0\nnet.inet6.ip6.forwarding=1\nnet.inet6.ip6.accept_rtadv=0' >> /etc/sysctl.conf +echo 'description "LAN"\ninet 192.168.12.1 255.255.255.0 NONE' > /etc/hostname.re2 +sync +~~~ + +## Persistance de /var et /home + +Dans /etc/rc.flashrd.sub vérifier que les lignes suivantes sont présentes et décommentées : +~~~ +tardirs="var" +set -A tarsize 64M # tmpfs sizes for tar dirs +# +# If you want to save all "tardirs" contents on shutdown: +savetardirs="$tardirs" +~~~ + +Le ramdisk de /var sera ainsi sauvegardé dans /flash/var.tar à l'extinction du routeur, et décompacté au démarrage. + +Si des modifications importantes sont faites, il est possible de régénérer l'archive manuellement ainsi : + +~~~ +tar cf /flash/var.tar -C /var . +~~~ + +Pour /home : +~~~ +mkdir /flash/home/ +rmdir /home +cat /etc/rc.local +# $OpenBSD: rc.local,v 1.44 2011/04/22 06:08:14 ajacoutot Exp $ + +# Site-specific startup actions, daemons, and other things which +# can be done AFTER your system goes into securemode. For actions +# which should be done BEFORE your system has gone into securemode +# please see /etc/rc.securelevel. + +rmdir /home +ln -sf /flash/home /home +# Run flashrd final boot routine +/etc/rc.flashrd.local +~~~ + +Ainsi, /home devient un lien symbolique vers le répertoire /flash/home qui est sur une partition persistante. C'est la méthode à préférer quand /home ne contient que des données "froides". + +Il est également possible dans le cas ou /home accueillerait des données écrites fréquemment de créer un ramdisk à la manière de /var. Dans ce cas, au lieu de réaliser la procédure précédente, il faut modifier le fichier /etc/rc.flashrd.sub comme ceci : + +~~~ +tardirs="var home" +set -A tarsize 64M 32M # tmpfs sizes for tar dirs +# +# If you want to save all "tardirs" contents on shutdown: +savetardirs="$tardirs" +~~~ + +Et de la même manière, pour sauvegarder l'arborescence sans attendre le prochain reboot (propre ! Sinon les données depuis la dernière archive sont perdues) : + +~~~ +tar cf /flash/home.tar -C /home . +~~~ \ No newline at end of file diff --git a/CarteRAID.md b/CarteRAID.md new file mode 100644 index 00000000..58902d4d --- /dev/null +++ b/CarteRAID.md @@ -0,0 +1,31 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +Pour installer sous Squeeze : + + +Mettre en place le RAID 1 : + +## Activer les cache lectures et écritures (avec BBU) : + +~~~ +megacli -LDSetProp -Cached -LAll -aAll +megacli -LDSetProp EnDskCache -LAll -aAll +megacli -LDSetProp ADRA -LALL -aALL +megacli -LDSetProp WB -LALL -aALL +~~~ + +## Infos + +Voir les infos globales : + +~~~ +# megacli -AdpAllInfo -aAll +~~~ + + +Voir les infos des volumes : + +~~~ +# megacli -LDInfo -L0 -a0 +# megacli -LDInfo -L1 -a0 +~~~ diff --git a/CloudOVH.md b/CloudOVH.md new file mode 100644 index 00000000..16aa7fa1 --- /dev/null +++ b/CloudOVH.md @@ -0,0 +1,17 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Cloud OVH + +## Adressage IP + +Attention, pour chaque sous-réseau (public ou privé) il ne faut *pas* utiliser (outre NetID et Broadcast évidemment) les 3 adresses les plus hautes. + +Par exemple, pour 172.21.22.0/24 : + +~~~ +172.21.22.0 : NetID +172.21.22.252 : réservé pour OVH +172.21.22.253 : réservé pour OVH +172.21.22.254 : gateway OVH +172.21.22.255 : Broadcast OVH +~~~ diff --git a/FreeBSD.md b/FreeBSD.md new file mode 100644 index 00000000..83f486ee --- /dev/null +++ b/FreeBSD.md @@ -0,0 +1,74 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto FreeBSD + +## Installer un package + +~~~ +# setenv PACKAGESITE ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8.3-release/Latest/ +# setenv FTP_PASSIVE_MODE 1 +# pkg_add -r php5-simplexml +Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8.3-release/Latest/php5-simplexml.tbz... Done. +~~~ + +## Compiler depuis l'arbre des ports + +~~~ +# cd /usr/ports/categorie_du_paquet/nom_du_paquet +# make +# make install +~~~ + +## Voir les paquets installés + +~~~ +# pkg_info -Ix nom_du_paquet +~~~ + + +## Mises à jour avec freebsd-update(8) + + + +Exemple : + +~~~ +# pkg_delete -a (supprime tous les packages !!) +# freebsd-install +# reboot +# freebsd-install +~~~ + +## Optimisations + + + +Optimisations réseau pour permettre un grand nombre de connexions : + +~~~ +# sysctl kern.ipc.nmbclusters=262144 +# sysctl kern.ipc.maxsockets=204800 +# sysctl net.inet.tcp.msl=20000 +~~~ + + + +## Admin + + + +Ajout d'un groupe : + +~~~ +# pw groupadd +# pw groupmod -M +~~~ + +## Installer des paquets à l'identique d'un serveur à l'autre + +~~~ +server1# for i in /var/db/pkg/*; do pkg_create -b $i; done +server1# rsync *.tbz server2: + +server2# pkg_add -i *.tbz +~~~ diff --git a/HowToRedmine-Source.md b/HowToRedmine-Source.md new file mode 100644 index 00000000..f0ee7a41 --- /dev/null +++ b/HowToRedmine-Source.md @@ -0,0 +1,202 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Installation Redmine + +Ce document explique l'installation du logiciel Redmine depuis les sources. + +Cette installation à été testé sur une Debian Jessie avec Redmine en version 3.0, 3.1 et 3.2. + +Informations supplémentaires : + +* [wiki:HowToRedmine-Source/Migrate Migrer une installation existante] +* [wiki:HowToRedmine-Source/Save Backup de votre installation] +* [wiki:HowToRedmine-Source/Update Mettre à jour votre installation] +* [wiki:HowToRedmine-Source/Delete Supprimer votre installation] +* [wiki:HowToRedmine-Source/Plugins Installer des plugins] + +À noter : + +* Les catégories nomnées prérequis ne sont à faire qu'une seule fois par serveur. +* Les commandes sont à lancer avec l'utilisateur entre parenthèse. + +### 0. Prérequis (User = root) + +Installations des dépendances : +~~~ +aptitude install ruby ruby-dev imagemagick git-core git-svn gcc build-essential libxml2-dev libxslt1-dev libssl-dev +~~~ +Installation des dépendances 2 (L'installation en une fois crée des conflits !) : +~~~ +aptitude install libmagickwand-dev libmagickcore-dev +~~~ +Si Squid est présent vous devez rajouter les sites github et rubygems dans sa liste blanche ! +~~~ +echo " >> /etc/squid3/whitelist.conf +echo " >> /etc/squid3/whitelist.conf +echo " >> /etc/squid3/whitelist.conf +~~~ +#### /home ne doit pas avoir l'attribut noexec !!! + +### I. Création du compte Unix (User = root) + +Choix de l'utilisateur $REDMINE propriétaire de l'application +~~~ +REDMINE='redmine' +~~~ +Création de l'utilisateur $REDMINE : +~~~ +useradd $REDMINE -d "/home/$REDMINE" -c "Redmine $REDMINE" -s "/bin/bash" -m +~~~ +Ajout de l'utilisateur www-data au groupe $REDMINE : +~~~ +adduser www-data $REDMINE +~~~ + +### II. Création de la base de donnée (User = root) + +Au choix : + +* [wiki:HowToRedmine-Source/BDD/MySQL MySQL] + +### III. Serveur Web (User = root) + +Au choix : + +* [wiki:HowToRedmine-Source/Web/Nginx Nginx] + +### IV. Serveur d'application (User = root) + +Au choix : + +* [wiki:HowToRedmine-Source/Rails/Puma Puma] + +### V. Finalisation (User = $REDMINE) + +Se connecter avec l'utilisateur $REDMINE : +~~~ +su - $REDMINE +~~~ + +Choisir la $BRANCHE de la version de Redmine : + +* voir le dépôt [Github](https://github.com/redmine/redmine) pour choisir une version +* vérifier les prérequis sur [redmine.org](http://www.redmine.org/projects/redmine/wiki/FrRedmineInstall#Exigences) + +~~~ +BRANCHE=3.3-stable +~~~ + +Ajout des gems locales dans le $PATH : +~~~ +cat >> ~/.profile < -b $BRANCHE ~/www +~~~ +Création des dossiers nécessaires : +~~~ +mkdir ~/files +~~~ +Copie de la configration de Redmine : +~~~ +cat > ~/www/config/configuration.yml < ~/www/config/database.yml < "Admin", :lastname => "Admin", :mail => "admin@example.com", :mail_notification => "none", :status => 1 +user.login = 'admin' +user.hashed_password = "4af53bd5aff3b4b8ac275cfc918244f7e61aa4cb" +user.salt = "270d36d363b07abc40245d02348a53a8" +user.admin = true +user.save +~~~ \ No newline at end of file diff --git a/HowToRedmine-Source/BDD/MySQL.md b/HowToRedmine-Source/BDD/MySQL.md new file mode 100644 index 00000000..32d9bd46 --- /dev/null +++ b/HowToRedmine-Source/BDD/MySQL.md @@ -0,0 +1,36 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Mysql + +### Prérequis + +Installation de [wiki:HowtoMySQL MySQL]. + +Installation des librairies de développements MySQL +~~~ +aptitude install libmysqlclient-dev +~~~ + +### Configuration + +Création de l'utilisateur et de la base de donnée : +~~~ +MYSQLPASS=$(perl -e 'print map{("a".."z","A".."Z",0..9)[int(rand(62))]}(1..16)') +mysql < /home/$REDMINE/.my.cnf < redmine_dump.sql +~~~ +Puis stopper votre nouvelle installation : +~~~ +systemctl stop puma@$REDMINE +~~~ +Vider la base de donnée actuelle : +~~~ +TABLES=$(mysql $USER -e 'show tables' | awk '{ print $1}' | grep -v '^Tables' ) +for t in $TABLES +do + echo "Deleting $t table from $USER database..." + mysql $USER -e "drop table $t" +done +~~~ +Importer votre dump SQL: +~~~ +mysql -D $USER --default-character-set=utf8 < redmine_dump.sql +~~~ +Migrer la base de données : +~~~ +rake -qf ~/redmine/Rakefile db:migrate RAILS_ENV=production +~~~ +Migrer les plugins : +~~~ +rake -qf ~/redmine/Rakefile redmine:plugins:migrate RAILS_ENV=production +~~~ +Relancer votre Redmine : +~~~ +systemctl start puma@$REDMINE +~~~ +Synchroniser les fichiers attachés : +~~~ +scp -Cr votre-serveur-actuel.tld:dossier-files ~/ +~~~ \ No newline at end of file diff --git a/HowToRedmine-Source/Plugins.md b/HowToRedmine-Source/Plugins.md new file mode 100644 index 00000000..f105b953 --- /dev/null +++ b/HowToRedmine-Source/Plugins.md @@ -0,0 +1,43 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Plugins + +### Listes des plugins + +* [wiki:HowToRedmine-Source/Plugins/Redmine_multiprojects_issue Plugin Redmine Multiprojects Issue] +* Permet d'assigner des projets secondaires à une demande. +* [wiki:HowToRedmine-Source/Plugins/Redmine_git_hosting Plugin Redmine Git Hosting] +* Permet l'intégration de Redmine avec Gitolite. +* [wiki:HowToRedmine-Source/Plugins/Redmine_wiki_notes Plugin Redmine Wiki Notes] +* Ajoute des macros au wiki pour afficher un bloc de type note/info/warning/tip. + +### Mise à jour (User = $REDMINE) + +*Éteindre Puma avant les mises à jours.* + +Rendez vous dans le dossier du plugins /home/$REDMINE/redmine/plugins/nom_plugin puis : + +Pour une mise à jour mineure : +~~~ +git pull +~~~ +Pour une mise à jour majeure, récuperer la dernière branche stable, vérifier les prérequis puis : +~~~ +git checkout $BRANCHE +~~~ +Effectuer ensuite les tâches post-update ci-dessous. + +### Taches post-installation / post-update + +Mise à jour des gem : +~~~ +bundle install --gemfile=~/www/Gemfile --path=~/.gem +~~~ +Migration des plugins : +~~~ +rake -qf ~/www/Rakefile redmine:plugins:migrate RAILS_ENV=production +~~~ +Correction des droits +~~~ +chmod u=rwX,g=rX,o= ~/www/plugins -R" +~~~ \ No newline at end of file diff --git a/HowToRedmine-Source/Plugins/Redmine_git_hosting.md b/HowToRedmine-Source/Plugins/Redmine_git_hosting.md new file mode 100644 index 00000000..1fd9e1fe --- /dev/null +++ b/HowToRedmine-Source/Plugins/Redmine_git_hosting.md @@ -0,0 +1,116 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Plugin Redmine Git Hosting + Gitolite + +#### Redmine et Gitolite doivent se situer sur le même serveur ! + +## Prérequis + +Installation de gitolite 3 (sous Wheezy nécessite les backports) : +~~~ +aptitude install gitolite3 +~~~ + +Installation des dépendances Redmine Git Hosting : +~~~ +aptitude install build-essential libssh2-1 libssh2-1-dev cmake libgpg-error-dev +~~~ +Mise en place de [wiki:HowtoGitDaemon git-daemon] et [wiki:HowtoGitWeb gitweb] (optionnel). + +## I. Installation Gitolite + +Choix de l'utilisateur $GITOLITE : + +* $GITOLITE : utilisateur propriétaire de l'application +* accès SSH depuis $GITOLITE@votre-domaine.tld + +~~~ +GITOLITE='git' +~~~ +Création de l'utilisateur système $GITOLITE ainsi que son groupe. +~~~ +useradd $GITOLITE -d "/home/$GITOLITE" -c "Gitolite $GITOLITE" -s "/bin/bash" -m +~~~ + +Initialisation de Gitolite : +~~~ +cp /home/$REDMINE/.ssh/redmine_gitolite_admin_id_rsa.pub /home/$GITOLITE/ +chown $GITOLITE: /home/$GITOLITE/redmine_gitolite_admin_id_rsa.pub +su - $GITOLITE -c "gitolite setup -pk redmine_gitolite_admin_id_rsa.pub" +rm /home/$GITOLITE/redmine_gitolite_admin_id_rsa.pub +~~~ +Configuration gitolite3 : +~~~ +chmod 750 -R /home/$GITOLITE/repositories /home/$GITOLITE/projects.list +vi /home/$GITOLITE/.gitolite.rc +#changer UMASK de 0077 à 0027 +#changer GIT_CONFIG_KEYS de '' à '.*' +#décommenter la ligne : LOCAL_CODE => "$ENV{HOME}/local" +~~~ +Interdit l'utilisateur $GITOLITE de se connecter avec un mot de passe et l'autorise à se connecter si l'accès SSH est limité : +~~~ +cat >> /etc/ssh/sshd_config < -b v0.2.x ~/redmine/plugins/redmine_bootstrap_kit +git clone -b v1.2.x ~/redmine/plugins/redmine_git_hosting +~~~ +Ajout du scm Xitolite dans Redmine : +~~~ +echo " scm_xitolite_command: /usr/bin/git" >> ~/redmine/config/configuration.yml +~~~ + +### III. Configuration de l'accès sudo (User = root) + +*A faire même si l'utilisateur $GITOLITE est le même que $REDMINE* + +Autorise $REDMINE à sudo vers $Gitolite : +~~~ +cat > /etc/sudoers.d/$REDMINE\_$GITOLITE < Redmine Git Hosting Plugin -> SSH et remplacer : +* Nom d'utilisateur Gitolite par la valeur de $GITOLITE +* L'emplacement des clés privées et publiques SSH de Gitolite par le dossier .ssh de l'utilisateur $REDMINE +* Rendez vous dans Administration -> Redmine Git Hosting Plugin -> Accès et remplacer : +* Nom de domaine du serveur HTTP et HTTPS par le nom de domaine de votre serveur +* Nom de domaine du serveur SSH par $GITOLITE.votredomain.tld +* Rendez vous dans Administration -> Redmine Git Hosting Plugin -> Stockage et remplacer : +* Répertoire de stockage des hooks non-core par hooks +* Rendez vous dans Administration -> Redmine Git Hosting Plugin -> Hooks et remplacer : +* Url des hooks par +* Cliquer en haut à droit sur installer les hooks ! +* Rendez vous dans Administration -> Redmine Git Hosting Plugin -> Test de la configuration et vérifier que tous les indicateurs sont au vert \ No newline at end of file diff --git a/HowToRedmine-Source/Plugins/Redmine_multiprojects_issue.md b/HowToRedmine-Source/Plugins/Redmine_multiprojects_issue.md new file mode 100644 index 00000000..ff9cb37c --- /dev/null +++ b/HowToRedmine-Source/Plugins/Redmine_multiprojects_issue.md @@ -0,0 +1,18 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Plugin Redmine Multiprojects Issue + +Connection en tant que l'utilisateur $REDMINE : +~~~ +su - $REDMINE +~~~ +Clonage des plugins dans redmine/plugins : +~~~ +git clone /home/$REDMINE/redmine/plugins/redmine_base_select2 +git clone /home/$REDMINE/redmine/plugins/redmine_base_deface +git clone /home/$REDMINE/redmine/plugins/redmine_multiprojects_issue +~~~ + +#### Si le plugin est installé après Redmine et non en même temps : + +Exécuter les taches [wiki:HowToRedmine-Source/Plugins post-installation]. \ No newline at end of file diff --git a/HowToRedmine-Source/Plugins/Redmine_wiki_notes.md b/HowToRedmine-Source/Plugins/Redmine_wiki_notes.md new file mode 100644 index 00000000..e7dcebd1 --- /dev/null +++ b/HowToRedmine-Source/Plugins/Redmine_wiki_notes.md @@ -0,0 +1,16 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Plugin Redmine Wiki Notes + +Connection en tant que l'utilisateur $REDMINE : +~~~ +su - $REDMINE +~~~ +Clonage du plugin dans redmine/plugins : +~~~ +git clone +~~~ + +#### Si le plugin est installé après Redmine et non en même temps : + +Exécuter les taches [wiki:HowToRedmine-Source/Plugins post-installation]. \ No newline at end of file diff --git a/HowToRedmine-Source/Rails/Puma.md b/HowToRedmine-Source/Rails/Puma.md new file mode 100644 index 00000000..85fb8983 --- /dev/null +++ b/HowToRedmine-Source/Rails/Puma.md @@ -0,0 +1,66 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Puma + +### 0. Prérequis + +Installation de Puma : +~~~ +gem install puma +~~~ +Création du dossier de configuration : +~~~ +mkdir /etc/puma +~~~ +Création d'un service SystemD : +~~~ +cat > /etc/systemd/system/puma@.service < /etc/puma/$REDMINE.rb < redmine_dump.sql +~~~ + +Sauvegarde de la configuration de Redmine : +~~~ +tar -zcvf ~/$USER_config.tgz ~/redmine/config +~~~ + +Sauvegarde des fichiers attachées : +~~~ +tar -zcvf ~/$USER_files.tgz ~/files +~~~ \ No newline at end of file diff --git a/HowToRedmine-Source/Update.md b/HowToRedmine-Source/Update.md new file mode 100644 index 00000000..dc2131f7 --- /dev/null +++ b/HowToRedmine-Source/Update.md @@ -0,0 +1,77 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Mise à jour de votre installation Redmine + +Connection en tant que l'utilisateur $REDMINE : +~~~ +# su - $REDMINE +$ umask 022 +~~~ + +Rendez vous dans le dossier d'installation de Redmine : +~~~ +$ cd ~/redmine +~~~ + +## Pour faire une mise à jour mineure (ex: 3.0.2 vers 3.0.3) + +~~~ +# su - $REDMINE +$ umask 022 +$ cd ~/redmine +$ git pull +$ bundle update +# systemctl restart puma@$REDMINE +# systemctl status puma@$REDMINE +~~~ + +## Pour faire une mise à jour majeure (ex: 2.6 vers 3.0) + +Déterminer votre branche courante (elle est précédé d'un étoile) : +~~~ +$ git branch +~~~ +Lister les branches distantes (ne prendre en compte que les versions stables) : +~~~ +$ git pull +$ git branch -r +~~~ +Si une version plus récente de Redmine est présente, vérifier les prérequis en vous rendant sur [redmine.org](http://www.redmine.org/projects/redmine/wiki/RedmineInstall#Requirements) + +Version de Ruby et de Ruby on Rails : +~~~ +$ ruby -v +$ rails -v +~~~ + +Si les prérequis sont satisfaits : +~~~ +# systemctl stop puma@$REDMINE +# su - $REDMINE +$ umask 022 +$ gem update puma --user +$ cd ~/redmine +# systemctl stop puma@$REDMINE +$ git pull +$ git checkout $BRANCHE +$ rm Gemfile.lock +$ bundle update +$ rake -q db:migrate RAILS_ENV=production +# systemctl start puma@REDMINE +$ systemctl status puma@REDMINE +~~~ + +Mise à jour des plugins (exemple avec le plugin foo) : + +~~~ +# su - $REDMINE +$ umask 022 +$ cd ~/redmine +# systemctl stop puma@$REDMINE +$ cd plugins ; ls +$ cd foo +$ git pull && git branch -r +$ rake -q redmine:plugins:migrate RAILS_ENV=production +# systemctl start puma@REDMINE +$ systemctl status puma@REDMINE +~~~ \ No newline at end of file diff --git a/HowToRedmine-Source/Web/Nginx.md b/HowToRedmine-Source/Web/Nginx.md new file mode 100644 index 00000000..302638e4 --- /dev/null +++ b/HowToRedmine-Source/Web/Nginx.md @@ -0,0 +1,82 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Nginx + +### Prérequis + +Installation de [wiki:HowtoNginx Nginx]. + +### Configuration + +Création du dossier de log : +~~~ +mkdir /var/log/nginx/$REDMINE +chown www-data:adm /var/log/nginx/$REDMINE +chmod u=rwx,g=rxs,o= /var/log/nginx/$REDMINE +~~~ + +Création du vhost $REDMINE : +~~~ +cat > /etc/nginx/sites-available/$REDMINE < +# } + + +# ssl_certificate /etc/ssl/certs/redmine_$REDMINE.crt; +# ssl_certificate_key /etc/ssl/private/redmine_$REDMINE.key; + + root /home/$REDMINE/www/public; + access_log /var/log/nginx/$REDMINE/access.log; + error_log /var/log/nginx/$REDMINE/error.log; + error_page 503 @maintenance; + location / { + if (!-f /run/$REDMINE/ruby.pid) { + return 503; + } + try_files \$uri @ruby; + } + location @maintenance { + #proxy_pass + rewrite ^(.*)$ /500.html break; + } + location @ruby { + proxy_set_header X-Forwarded-Proto \$scheme; + proxy_set_header X-Forwarded-For \$remote_addr; + proxy_set_header Host \$ + proxy_redirect off; + proxy_read_timeout 300; + proxy_pass + } +} +EOF +~~~ +Activation du vhost $REDMINE : +~~~ +ln -s /etc/nginx/sites-available/$REDMINE /etc/nginx/sites-enabled/$REDMINE +~~~ +Pour mettre en place le ssl, voir [wiki:HowtoSSL] et nommée votre certificat et votre clé comme ceci : + +* /etc/ssl/certs/redmine_$REDMINE.crt +* /etc/ssl/private/redmine_$REDMINE.key. + +Test de la configuration nginx et rechargement le cas échéant : +~~~ +nginx -t +if [ $? == 0 ]; then + service nginx reload +fi +~~~ + +#### Si iptables est configuré, pensez à ouvrir les ports 80 et 443 entrants ! \ No newline at end of file diff --git a/HowToSFTP.md b/HowToSFTP.md new file mode 100644 index 00000000..170e727c --- /dev/null +++ b/HowToSFTP.md @@ -0,0 +1,7 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Connexion sur port différent de 22 + +~~~ +sftp -o "Port 3432" user@host +~~~ \ No newline at end of file diff --git a/HowtoACL.md b/HowtoACL.md new file mode 100644 index 00000000..d366d00b --- /dev/null +++ b/HowtoACL.md @@ -0,0 +1,32 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto ACL + +Savoir que le fichier a un ACL configuré (+) : +~~~ +$ ls -dl foo/ +drwxr-x---+ ... +~~~ + +### Obtenir ACL + +~~~ +# getfacl foo/ +~~~ +récupérer le statut ACL sur le fichier. + + +### Modifier ACL + +~~~ +# setfacl -R -m group:example:rwx foo/ +~~~ +-R : récursif, -m : pour modifier. + +~~~ +# setfacl -d -R -m group:example:rwx foo/ +~~~ +-d : défaut + + + diff --git a/HowtoAlfresco.md b/HowtoAlfresco.md new file mode 100644 index 00000000..92e8b76d --- /dev/null +++ b/HowtoAlfresco.md @@ -0,0 +1,105 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Howto Alfresco Community + +### Installation + +Installer Tomcat 6 (voir [wiki:HowtoTomcat]) + +Installer MySQL (voir [wiki:HowtoMySQL]) + +Installer JDBC : + +~~~ +# aptitude install libmysql-java +# cd /usr/share/tomcat6/lib/ +# ln -s ../../java/mysql-connector-java.jar mysql.jar +~~~ + +Si cela n'est pas fait, vous aurez les erreurs très explicites : +~~~ +Caused by: org.hibernate.HibernateException: Hibernate Dialect must be explicitly set) +~~~ + +Alfresco a aussi besoin d'OpenOffice et ImageMagick : + +~~~ +# aptitude install openoffice.org-headless imagemagick +~~~ + +Egalement l'outil _swftools_ non disponible sous Debian Lenny, on va donc se servir chez les voisins : + +~~~ +wget +dpkg -i swftools_0.8.1-2.1ubuntu1_amd64.deb +~~~ + +Il faut aussi préparer un répertoire pour le "contentstore" (stockage brut des documents), un autre pour les documents supprimés (à purger de temps en temps), un pour les index _Lucene_ et un autre pour les sauvegardes de ces index. Par exemple : + +~~~ +# mkdir /srv/contentstore /srv/contentstore.deleted /srv/indexes /srv/indexes.backup +# chown tomcat6:tomcat6 /srv/contentstore /srv/contentstore.deleted /srv/indexes /srv/indexes.backup +~~~ + +Pour configurer Alfresco, le plus simple est de créer un fichier _alfresco-global.properties_ (à mettre par exemple dans _/var/lib/tomcat6/shared/classes/_) : + +~~~ +db.name=NOM BDD +db.username=USER BDD +db.password=PASS BDD +db.host=127.0.0.1 +db.port=3306 + +db.driver=org.gjt.mm.mysql.Driver +db.url=jdbc:mysql://${db.host}:${db.port}/${db.name} +hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect + +ooo.exe=/usr/bin/soffice +img.root=/usr +swf.exe=/usr/bin/pdf2swf + +dir.root=/srv +dir.contentstore=${dir.root}/contentstore +dir.contentstore.deleted=${dir.root}/contentstore.deleted +dir.auditcontentstore=${dir.root}/audit.contentstore +dir.indexes=${dir.root}/indexes +dir.indexes.backup=${dir.root}/indexes.backup +~~~ + +Pour une configuration avancée, on utilisera le répertoire _/var/lib/tomcat6/shared/classes/alfresco/extension/_. +Par exemple pour customiser les logs d'Alfresco, on créera un fichier _myalfresco-log4j.properties_ : + +~~~ +log4j.appender.File2=org.apache.log4j.DailyRollingFileAppender +log4j.appender.File2.File=/var/log/tomcat6/alfresco.log +log4j.appender.File2.Append=true +log4j.appender.File2.DatePattern='.'yyyy-MM-dd +log4j.appender.File2.layout=org.apache.log4j.PatternLayout +log4j.appender.File2.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c] %m%n + +log4j.rootLogger=error, Console, File2 +~~~ + +Note : penser à créer le /var/log/tomcat6/alfresco.log avec les bons droits + +Télécharger alfresco-community-war-3.3.zip sur +et déployer les fichiers WAR (alfresco.war, share.war si besoin) dans le répertoire _/var/lib/tomcat6/webapps/_, puis : + +~~~ +# /etc/init.d/tomcat6 restart +~~~ + +### Administration JMX + + + +On peut utiliser l'outil _jconsole_ avec les paramètres suivants : + +~~~ +Remote process = service:jmx:rmi:///jndi/rmi://localhost:50500/alfresco/jmxrmi +Username = controlRole +Password = change_asap +~~~ + +Note : mots de passe à changer via les fichiers _alfresco-jmxrmi.*_ + diff --git a/HowtoAnsible.md b/HowtoAnsible.md new file mode 100644 index 00000000..fc847d09 --- /dev/null +++ b/HowtoAnsible.md @@ -0,0 +1,800 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Ansible + + + +Ansible est une plateforme de configuration et gestion de serveurs : il permet le déploiement de logiciels et l'execution de tâches via une connexion SSH. + +Ansible est *agent-less* et utilise le concept d’*[idempotence](https://fr.wikipedia.org/wiki/Idempotence)* : on décrit l'état d'un serveur dans un fichier YAML appelé *playbook* et des actions seront executées dans le but de rendre le serveur conforme à cette description. +On pourra relancer Ansible plusieurs fois, l'état final reste le même : seules les actions nécessaires seront exécutées. + +Ansible peut exécuter des actions sur des serveurs distants sous : + +* *Debian* 6 et supérieur (nécessite uniquement _Python_ ce qui est le cas par défaut) +* Debian 4 / 5 : voir [#AnsiblesurdesvieillesversionsDebian] +* *FreeBSD* et *OpenBSD* : TODO => décrire pré-requis + +## Installation + +Nous utilisons Ansible 2.0.2 (disponible via sous Debian 8 : + +~~~ +# apt install --allow-unauthenticated ansible=2.0.2.0-1~bpo8+1 +~~~ + + +## Utilisation + +~~~ +$ ansible --version +ansible 2.0.2.0 + config file = /etc/ansible/ansible.cfg + configured module search path = Default w/o overrides + +$ cat ~/.ansible.cfg +[defaults] +inventory = $HOME/.ansible/hosts + +[ssh_connection] +#ssh_args = -o ControlMaster=no -o ControlPersist=no +ssh_args = -o ControlMaster=auto -o ControlPersist=300s +pipelining = True + +$ echo HOSTNAME >> ~/.ansible/hosts +$ ssh-copy-id HOSTNAME + +$ ansible HOSTNAME -i $HOME/.ansible/hosts -m ping +HOSTNAME | SUCCESS => { + "changed": false, + "ping": "pong" +} + +$ ansible HOSTNAME -a "date" +HOSTNAME | SUCCESS | rc=0 >> +jeudi 26 mai 2016, 23:16:01 (UTC+0200) + +$ ansible-playbook PLAYBOOK.yml --limit HOSTNAME --forks 1 + +$ ansible-playbook PLAYBOOK_WITH-SUDO.yml --limit HOSTNAME --ask-become-pass +~~~ + +Options utiles pour [ansible-playbook](https://manpages.debian.org/cgi-bin/man.cgi?query=ansible-playbook&apropos=0&sektion=0&manpath=Debian+unstable+sid&format=html&locale=en) : + +* *-vvvv* : très verbeux (utile notamment pour debug SSH quand on a une erreur _unreachable_) +* *-k / --ask-pass* : demande le mot de passe utilisateur (si connexion SSH sans clé) +* *-K / --ask-become-pass* : demande le mot de passe utilisateur pour sudo +* *-l / --limit HOSTNAME* : limite la connexion au serveur HOSTNAME (attention, par défaut c'est *all*, cf `/etc/ansible/hosts`) +* *-f / --forks N* : nombre de process lancé en parallèle (par défaut 5)... peut être utile de mettre à 1 pour ne pas paralléliser + +## Howto Playbook + +~~~ +$ vim hello_World.yml + +- hosts: all + + tasks: + - shell: echo hello World + +# vim:ft=ansible: +~~~ + +Un playbook est un ensemble de "plays" ; un "play" contient au minimum *hosts* (serveurs cible) et *tasks* (ensemble de tâches), et peut également contenir : + +* *vars* : des variables +* *handlers* : des actions déclenchées si une tâche a été exécutée (via l'option `notify`) +* *roles* : des rôles pour avoir des playbooks organisés et modulaires + +### Modules pour tasks + + + +Pour avoir la liste des modules utilisables dans *tasks* : `ansible-doc -l` + +Voici quelques exemples : + +~~~ +- name : exemple avec le module COMMAND + command: date + +- name : exemple avec le module SHELL + shell: time date + +- name: exemple avec le module SERVICE + service: name= state=restarted + +- name: exemple avec le module FILE + file: path=/etc/cron.daily/apticron state=absent + +- name : exemple avec le module COPY + copy: src=files/foo dest=/etc/bar owner=root group=root mode=0644 + +- name : exemple avec le module LINEINFILE + lineinfile: dest=/etc/evocheck.cf insertafter=EOF line="IS_APTICRON=0" regexp="^IS_APTICRON=" + +- name : exemple avec le module USER + user: + state: present + name: {{ name }} + comment: 'John Doe' + shell: /bin/bash + groups: adm + append: yes + password: '$6$k/Fg76xH' + +- name : exemple avec le module REPLACE + replace: + dest: /etc/ssh/sshd_config + regexp: '^(Match User ((?!{{ name }}).)*)$' + replace: '\1,{{ name }}' + +- name : exemple avec le module STAT + stat: path=/etc/sudoers.d/foo + register: foo_sudoers_file + +- name : exemple avec le module APT + apt: + name: '{{ item }}' + state: latest + allow_unauthenticated: yes + update_cache: yes + cache_valid_time: 3600 + with_items: + - vim + - htop + +- name : exemple + apt_repository: + +- name: exemple avec le module INI_FILE + ini_file: + dest: /root/.my.cnf + section: client + option: user + value: root + mode: 0640 + +- name: exemple avec le module MYSQL_USER (nécessite le paquet python_mysqldb) + mysql_user: + name: mysqladmin + password: my_password + priv: "*.*:ALL,GRANT" + state: present + config_file: /root/.my.cnf + update_password: on_create + +- name: exemple avec l'ajout de plusieurs lignes dans un fichier + blockinfile: + dest: /etc/apache2/envvars + block: | + ## Set umask for writing by Apache user. + ## Set rights on files and directories written by Apache + +- name: exemple + systcl: + +- name: exemple + alternatives: + +- name: exemple + service: + +- name: exemple + mount: + +~~~ + +#### replace: vs lineinfile: + +* lineinfile: si regexp= n'est pas matché... il insère quand même la ligne ! avec lineinfile: regexp= n'est pas une condition pour l'insertion mais une condition pour remplacer au lieu d'insérer ! +* avec lineinfile: sauf cas tordus, regexp= doit matcher line= (sinon il va insérer line= à l'infini !) +* lineinfile: va 1. regarder si regexp= existe et il remplace la dernière ligne, 2. si regexp n'existe pas, il ajoute line= (sans d'autre condition... même si elle existe déjà) +* replace: il va remplacer uniquement si regex est matché, logique (comme sed) +* si l'on veut utiliser une référence (\1) dans line# avec lineinfile:> erreur, il faut utiliser replace: +* avec lineinfile: backrefs=yes c'est pour utiliser une référence au sein de regexp= (et non pas au sein de line=) + +### vars + +Gestion des variables : + +~~~ + vars: + + ip: 31.170.9.129 + conf_file: /etc/foo.conf + + tasks: + - shell: echo {{ ip }} {{ conf_file }} +~~~ + +Pour gérer de nombreuses variables dans un projet, voici l'arborescence conseillée : + +~~~ +group_vars/ + group1 # here we assign variables to particular groups + group2 # "" +host_vars/ + hostname1 # if systems need specific variables, put them here + hostname2 # "" +~~~ + + +### Handlers + +La directive `notify` permet de déclencher un `handler` après la fin d'éxecution d'une tâche : + +~~~ +tasks: +- apt: ... + notify: Done + +handlers: +- name: Done + shell: echo "It's done" +~~~ + +Le redémarrage d'un service devrait toujours être effectué via handler. + +### Tags + + + +Hormis le fait de ranger/trier chaque tâche dans une catégorie, permet de limiter/exclure des tâches. + +~~~ +- name: Coucou + debug: msg="Saloute!" + tags: message +... +~~~ + +Pour ne pas afficher les messages : +~~~ +$ ansible-playbook ... --skip-tags "message" +~~~ + +On peut appliquer des tags à des rôles, ou voir directement n'éxecuter que certains tags : +~~~ +$ ansible-playbook ... --tags "configuration,packages" +~~~ + +Note : on peut également _taguer_ des `include`. + +### Register + +`register`. est un élément/champ que l'on peut rajouter pour tout type de tâche et qui initialisera la variable (par le nom donné) avec les valeurs retour du module. +Pour shell, on a le droit à `.stdout`, `.stderr`, `.rc`, ... Mais cela dépend bien des valeurs de retour du module. +Mais pour être sûr des valeurs initialisées, on peut utiliser `debug` afin d'analyser le résultat. + +~~~ +- stat: path=/etc/passwd + register: st + +- debug: var=st + +- fail: msg="Whoops! file ownership has changed" + when: st.stat.pw_name != 'root' +~~~ + +Pour certains modules, `register` est un passage obligatoire pour une utilisation cohérente des éléments (stat...). + +## Configuration + + + +La configuration est lue dans l'ordre suivant : + +~~~ + +* ANSIBLE_CONFIG (an environment variable) +* ansible.cfg (in the current directory) +* .ansible.cfg (in the home directory) +* /etc/ansible/ansible.cfg +~~~ + + +### Fichier "inventory" + + + +Permet d'indiquer la liste des machines concernées par Ansible (peut être limité lors de l'exécution de la commande par l'option `-l`) et de pouvoir les regrouper dans des groupes. + +Exemple: +~~~ +hostname.internal + +[] +machine[01:57].example.com + + +[dbservers] +machine12.example.com +machine50.example.com +m[a:o]chine52.example.com +alias ansible_port=2222 ansible_host=192.168.1.50 + +[client] +host1 maxRequestsPerChild=808 #des variables qui seront automatiquement auto-completé lié à cet host + +[commercant] +mercerie +chapeautier + +[commercant:vars] +ntp_server=ntp.mercerie.example.com +proxy=proxy.mercerie.example.com +~~~ + +* *hostname.internal* : host hors groupe +* *[]* : le nom du groupe (pour les serveurs Les noms de hosts qui suivent appartiendront à ce groupe +* *machine[01:57].evolix.net* : on peut indiquer une [pseudo-]expression régulière - ici ajoutera les machines _machine01.evolix.net_, _machine02.evolix.net_, _machine03.evolix.net_, ..., _machine57.evolix.net_ +* * : ansible se connecte par ssh, et _ a un port ssh d'écoute différent qui est 2222 +* *[dbservers]* : groupe pour les serveurs de base de donnée +* *machine50.example.com* : cette machine est déjà présente dans le groupe _ mais sera aussi accessible à partir du groupe _dbservers_ +* *alias ansible_port=2222 ansible_host=192.168.1.50* : la machine alias n'est pas un vrai FQDN mais pointera vers _192.168.1.50_ car on a indiqué des variables propre à _ansible_. Il est aussi disponible `ansible_connection` (local ou ssh) ou `ansible_user` (le nom de l'utilisateur de la machine distante avec lequel _ansible_ se connectera en ssh) +* *host1 maxRequestsPerChild=808* : des variables qui seront automatiquement auto-completé lié à host1 +* *[commercant:vars]* : des variables qui seront liés au groupe _commercant_. On peut aussi créer des groupes de groupes en utilisant `:children` + +On peut aussi découper le fichier "inventory" selon les groupes et les variables : []. + +Les variables propres à Ansible : [] + +### ansible.cfg + +Options utiles (TODO : à revoir) : + +* *display_args_to_stdout* : mettre à `True` si on veut voir tout le contenu du _tasks_ executé pour chaque étape écrit sur _stdout_ +* *display_skipped_hosts* : mettre à `False` si on ne veut pas voir affiché sur _stdout_ l'information d'un _task_ qui n'est pas exécuté _(le nom de variable est confu - mais il s'agit bien de l'affichage du task)_ +* *error_on_undefined_vars* : mettre à `True` pour être sûr que le script ansible s'arrête si une variable n'est pas défini (alors qu'il y a utilisation de cette dernière dans une _task_) +* *force_color* : mettre à `1` pour forcer la couleur +* *forks* : le nombre de processus en parallèle possible lors déploiement du script ansible sur nombreux _hosts_. +* *module_lang* : changer la langue +* *module_name* : le module par défaut (`command`) lors de l'utilisation de la commande `ansible` +* *hosts* : accès vers les _hosts_ par défaut (`all`) +* *private_key_file* : le chemin pour la clé pem +* *remote_port* : le port ssh par défaut (`22`) +* *remote_user* : l'utilisateur pour la connexion ssh par défaut (`root`) +* *retry_files_enabled* : mettre à `True` pour la création de fichier `.retry` après une failure de ansible pour reprendre le travail précédent - ajouté en argument dans l'appel de la commande + + +## Erreurs + +### unbalanced jinja2 block or quotes + +~~~ +fatal: [test.evolix.net]: FAILED! => {"failed": true, "reason": "error while splitting arguments, either an unbalanced jinja2 block or quotes"} +~~~ + +Vérifier bien la syntaxe du document qui est référé pour cette erreur. Cela peut être une quote mal fermé (ou mélange simple quote, double quote), ou encore histoire de crochet devenant une parenthèse... + +### UNREACHABLE! + +~~~ +fatal: [test.evolix.net]: UNREACHABLE! => {"changed": false, "msg": "SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue", "unreachable": true} +~~~ + +Malheureusement, cela arrive souvent sur certaines machines (une?), mais pas de solutions pour le moment -> boire du café - beaucoup de café. + +Du côté de la machine distante, dans le fichier `/var/log/auth.log`: +~~~ +14:56:29 localhost sshd[19915]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=dual.evolix.net user=service +14:56:31 localhost sshd[19915]: Accepted password for service from 192.168.4.137 port 42502 ssh2 +14:56:31 localhost sshd[19915]: pam_unix(sshd:session): session opened for user service by (uid=0) +14:56:31 localhost systemd-logind[641]: New session 181 of user service. +14:56:32 localhost sshd[19915]: pam_unix(sshd:session): session closed for user service +14:56:32 localhost systemd-logind[641]: Removed session 181. +~~~ + +Et quand ça marche - la session ne se referme pas, et est réutilisé par les exécutions playbook suivantes: +~~~ +14:58:57 localhost sshd[20339]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=dual.evolix.net user=service +14:59:00 localhost sshd[20339]: Accepted password for service from 192.168.4.137 port 42511 ssh2 +14:59:00 localhost sshd[20339]: pam_unix(sshd:session): session opened for user service by (uid=0) +14:59:00 localhost systemd-logind[641]: New session 182 of user service. +... +15:01:08 localhost sshd[23034]: Received disconnect from 192.168.4.137: 11: disconnected by user +15:01:08 localhost sshd[23024]: pam_unix(sshd:session): session closed for user service +15:01:08 localhost systemd-logind[641]: Removed session 182. +~~~ + +Mais si tentative de déploiement ansible juste après la session supprimé (par ex la 182), c'est à ce moment là qu'on se retrouve avec des *UNREACHABLE* -> savoir pourquoi sshd supprime la session ssh... + +### Missing required arguments + +~~~ +fatal: [test.evolix.net]: FAILED! => {"changed": false, "failed": true, "msg": "missing required arguments: section"} +~~~ + +Le message est assez clair, donc bien relire la doc du module sur ansible, et toujours ajouter les arguments obligatoires pour ce module. + +### Requires stdlib json or simplejson module + +~~~ +fatal: [lenny.evolix.net]: FAILED! => {"changed": false, "failed": true, "msg": "Error: ansible requires the stdlib json or simplejson module, neither was found!"} +~~~ + +~~~ +# apt install python-simplejson +~~~ + +## Astuces + +### Vérifier un playbook + +* Vérifier la syntaxe : +~~~ +$ ansible-playbook --syntax-check my-experimental-playbook.yml +~~~ + + + +* vérifier les action qui vont être faite (mode _dry-run_) sans rien exécuter : +~~~ +$ ansible-playbook --check my-experimental-playbook.yml +~~~ + +* avoir le diff des fichiers modifiés (ne marche pas avec les modules replace/lineinfile à priori) : +~~~ +$ ansible-playbook --check --diff my-experimental-playbook.yml +~~~ + +### Plus d'infos sur module + +Lister les modules: +~~~ +# ansible-doc -l +~~~ + +Avoir des infos sur un module: +~~~ +# ansible-doc shell +> SHELL + + The [shell] module takes the command name followed by a li + space-delimited arguments. It is almost exactly like the [ +... +~~~ + +### Stopper l'éxecution du code + +Pour par exemple, stopper le code à un moment pour lire les valeurs d'une variables + +~~~ +- debug: var=cequejeveuxvoir +- command: /bin/false +~~~ + +ou + +~~~ +- debug: var=cequejeveuxvoir +- fail: msg="FAIL" +~~~ + +ou + +~~~ +- debug: var=cequejeveuxvoir +- pause: +~~~ + +### Ansible sur des vieilles versions Debian + +* Installer package python + +[] + +(bzip2, php, ... selon services à installer) +~~~ +- raw: apt-get -y install python-simplejson [bzip2 php5-cli] +~~~ + +* Si pas encore fait, donner droit mysql à l'utilisateur +~~~ +> GRANT ALL ON db.* TO 'user'@'localhost'; +~~~ + +### Limiter l'exécution à certaines machines + +* Limiter aux groupes www et sql (www et sql peuvent en fait être indifféremment des groupes ou des serveurs) : +~~~ +$ ansible-playbook -l "www:sql" playbook.yml +~~~ + +* limiter aux serveurs foo-www01, foo-lb01, foo-filer, etc… : +~~~ +$ ansible-playbook -l "foo-*" playbook.yml +~~~ + +* limiter aux 10 premiers serveurs de l'inventaire (utile pour faire par paquets) : +~~~ +$ ansible-playbook -l "*[0:9]" playbook.yml +~~~ + +* puis à ceux restant : +~~~ +$ ansible-playbook -l "*[10:]" playbook.yml +~~~ + +Il est de toute façon préférable de ne pas mettre *all* dans le champs *hosts* dans le playbook pour éviter un -_possible_- oublie de "limite" de machines. + +### Lancement tâches hosts asynchrone + +Pour éviter que les différentes tâches s'appliquent une par une sur tout les hosts impliqués par le déploiement du play ansible, on peut utiliser l'option `strategy` à la valeur `free` pour que chaques tâches sur un host puisse continuer dès la fin de son exécution sans attendre l'état des autres hosts concernés en cours. + +~~~ +- hosts: all +... + strategy: free +~~~ + +_Ne plus se fier au texte `host changed` après texte de la tâche, car il pourrait s'agir d'une autre tâche affiché plus en haut dans le texte de l'historique_ + +### Fréquence des hosts + +Lors d'une appel d'un play, on peut indiquer une fréquence sur le nombre d'host touché par l'éxecution du playbook. + +* `Fork` pour le nombre de hosts simultanés (changeable dans le fichier _ansible.cfg_ - mettre une valeur importante > centaine). +* `serial` en en-tête contenant une valeur numérique qui représente le nombre de machines pour chaque tour d'éxecution de playbook, ou un pourcentage par rapport à la liste inventory concerné. + +### Cowsay + +~~~ + ____________________ +< NO MORE HOSTS LEFT > + -------------------- + \ ^__^ + \ (oo)\_______ + (__)\ )\/\ + ||----w | + || || + ____________ +< PLAY RECAP > + ------------ + \ ^__^ + \ (oo)\_______ + (__)\ )\/\ + ||----w | + || || +~~~ + +Pour avoir les messages de la vache : *cowsay*. + +Si installer, pour le désactiver : `export ANSIBLE_NOCOWS=1` + +Disponible aussi dans la conf du fichier `/etc/ansible/ansible.cfg` + + + +### Conditions dans fichier jinja2 + +~~~ +{% if python_is_installed is defined %} +Ansible devrait marcher -pardi! +{% endif %} +~~~ + + +Voir la doc pour plus de features : + +### Lire une entrée au clavier + +S'il manque une valeur pour la suite du script, soit on le gère en mettant une erreur, ou une valeur par défaut, mais sinon on peut aussi demander une valeur a être tapé sur le clavier : + +~~~ +vars_prompt: +- name: 'prenom' + prompt: 'Quel est votre prénom ?' + private: no + +tasks: +- debug: var=prenom +~~~ +Malheureusement pour le moment, doit se situer avant `tasks`. + +Si on veut utiliser cette variable dans une tâche, il faut simplement utiliser le nom de la variable, et si on veut l'utiliser (explicitement) pour un play ne se trouvant pas dans le même fichier (donc ici la variable dans autre.yml s'appelera _prenom_de_autre_ et non prenom) : +~~~ +- include: './tasks/autre.yml' + vars: + prenom_de_autre: prenom +~~~ + + + +### Lancer playbook en mode interactif + +~~~ +ansible-playbook playbook.yml --step +~~~ + + + +### Ne pas lancer une commande shell si le fichier existe + +En initialisant le champs *creates* indiquant le chemin de fichier lors de l'utilisation du module shell, cette tâche là ne s'executera seulement si le fichier (chemint *creates* correspondant) n'existe pas. +Et le contraire (si le fichier existe la tâche se lancera), avec le champs *removes*. +Disponible sur certains module (comme *shell*). + +Plus simple et rapide que de tester le fichier par le module *stat* juste avant. + +### Lancer tâche sur machine précise (voir local) + +~~~ +- name: /etc/hosts + shell: cat /etc/hosts + register: tmp + delegate_to: localhost + +- debug: var=tmp.stdout +~~~ + +Pour local, peut être remplacer par la directive `local_action`. + + + +### Lancer tâche qu'une seule fois + +~~~ +- name: Début installation, envoie email + run_once: true + ... +~~~ + +Si ajouter avec `delegate_to`, seule cette machine executera cette tâche, sinon c'est la première dans la liste de l'inventory. + + + +### Appliquer une tâche à une liste (tableau) -> boucle + +#### with_items + +~~~ +- name: Manger les fruits + shell: eat '{{ item }}' + with_items: + - Apple + - Orange + - Strawberry + - Mango +~~~ + +Par exemple pour l'installation de plusieurs nouveaux packages : +~~~ +--- +- hosts: localhost + + tasks: + - apt: name='{{ item }}' state=present + with_items: [ 'cmatrix', 'tetrinet-server', 'tetrinet-client', 'xtel', 'xtell' ] +~~~ +Même si il y aura plusieurs packages installés, cela ne comptera que pour *un* changement (changed=1). +Cette tâche appellera un par un les éléments de la liste (présent dans with_items) pour le module. + +En l'appelant : +~~~ +ansible-playbook -b --ask-become-pass --become-method='su' --become-user='root' apt.yml +~~~ + +#### with_nested + +Pour croiser les éléments des items -> *"with_nested"*. +~~~ + tasks: + - include: "./ajout_utilisateur_sur_machine.yml" + vars: + user: "{{ item[0] }}" + server: "{{ item[1] }}" + with_nested: + - [ 'alice', 'bob' ] + - [ 'machine1', 'machine2', 'machine-backup' ] +~~~ +Qui aura pour effet d'appeler le include avec comme argument : item[0]=alice, item[1]=machine1; puis item[0]=alice, item[0]=machine2; ... puis item[0]=bob, item[1]=machine1, ... + +#### with_dict + +Avec hash ... +~~~ +users: + bob: + name: Bob + uid: 1000 + home: /home/bob + alice: + name: Alice + uid: 1001 + home: + + tasks: + - user: name="{{ item.key }}" comment="{{ item.value.name }}" uid="{{ item.value.uid }}" home="{{ item.value.home }}" + with_dict: "{{ users }}" +~~~ + +### Se connecter sous un autre utilisateur UNIX + +Par défaut, l'utilisateur se connectant sur le serveur distant est {{ ansible_user_id }} (càd uid courant UNIX). On peut soit le préciser dans le fichier de conf principal de ansible avec `remote_user : michu` ou en l'indiquant en argument lors de l'éxecution du playbook. +~~~ +ansible-playbook -u michu -k play.yml +~~~ + +### Éviter que la commande shell indique élement 'changed' + +Sur tout les modules, chaque taches retourne un statut sur son résultat : + +* Ok : Tout s'est bien passé +* Changed : Tout s'est bien passé mais il y a eu modification par rapport à l'état précédent (droits fichiers,...) +* Failed : Raté + +Le soucis est qu'il parrait bien difficile pour le module shell de connaître après execution de la commande s'il y a eu modification. Par défaut, il y a changement - quand bien même l'utilisation du shell se fait pour afficher un résultat (id, date, ...). +Pour éviter cela on peut mettre : +~~~ +- shell: date + changed_when: false +~~~ + +Ou donner une condition +~~~ +- shell: cat > {{ fichier }} +service.evolix.net | SUCCESS => { + "ansible_facts": { + ... + "ansible_architecture": "x86_64", + "ansible_bios_date": "12/01/2006", + "ansible_bios_version": "VirtualBox", + "ansible_cmdline": { + "BOOT_IMAGE": "/boot/vmlinuz-3.16.0-4-amd64", + "quiet": true, + "ro": true, + "root": "UUID=37de3cbb-3f28-48d2-a4eb-c893a2f2fbc3" + }, + "ansible_date_time": { + "date": "2016-05-06", + "day": "06", + "epoch": "1462546886", + "hour": "17", + ... + }, + "ansible_default_ipv4": { +... +} + +~~~ + +~~~ +$ ansible -m debug -a "var=hostvars['hostname']" localhost +~~~ + +Pour récupérer toutes les adresses MAC des machines : +~~~ +--- +- hosts: all + gather_facts: true + + tasks: + - debug: var=ansible_eth0.macaddress +~~~ + +que l'on pourra combiner par exemple avec un pipe en ligne de commande : +~~~ +ansible-playbook mac_address.yml | grep ansible_eth0.macaddress | sed 's/^\s*"ansible_eth0.macaddress": "\(.*\)"/\1/' +~~~ + +Il est possible aussi d'accéder aux variables d'environnement shell : +~~~ +"{{ lookup('env','HOME') }}" +~~~ + +## Ressources utiles + +* [Documentation officielle](http://docs.ansible.com/ansible/) (voir notamment la partie [Best Practices](http://docs.ansible.com/ansible/playbooks_best_practices.html)) +* [Ansible 101 - on a Cluster of Raspberry Pi 2s](https://www.youtube.com/watch?v=ZNB1at8mJWY) +* Sysadmin Casts (épisodes [43](https://sysadmincasts.com/episodes/43-19-minutes-with-ansible-part-1-4), [45](https://sysadmincasts.com/episodes/45-learning-ansible-with-vagrant-part-2-4), [46](https://sysadmincasts.com/episodes/46-configuration-management-with-ansible-part-3-4) et [47](https://sysadmincasts.com/episodes/47-zero-downtime-deployments-with-ansible-part-4-4)) +* [How Twitter uses Ansible](https://www.youtube.com/watch?v=fwGrKXzocg4) (AnsibleFest 2014) +* [Orchestration with Ansible at Fedora Project](http://fr.slideshare.net/AdityaPatawari/ansible-33223245) diff --git a/HowtoAsterisk.md b/HowtoAsterisk.md new file mode 100644 index 00000000..9235b927 --- /dev/null +++ b/HowtoAsterisk.md @@ -0,0 +1,207 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Asterisk + + + +## Installation + +~~~ +# aptitude install asterisk +~~~ + +On active son démarrage dans /etc/default/asterisk : + +~~~ +RUNASTERISK=yes +~~~ + +Puis on démarre : + +~~~ +# /etc/init.d/asterisk start +Starting Asterisk PBX: asterisk. +~~~ + +Connexion en mode CLI : + +~~~ +# asterisk -r +Asterisk 1.6.2.9-2+squeeze10, Copyright (C) 1999 - 2010 Digium, Inc. and others. +Created by Mark Spencer +Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details. +This is free software, with components licensed under the GNU General Public +License version 2 and other licenses; you are welcome to redistribute it under +certain conditions. Type 'core show license' for details. +========================================================================= +Connected to Asterisk 1.6.2.9-2+squeeze10 currently running on localhost (pid = 32537) +*CLI> +~~~ + +Plus d'infos sur les commandes sur + +## Configuration + +La configuration se passe dans le répertoire /etc/asterisk. Pour un mode VoIP simple, les fichiers de configuration principaux sont + +* sip.conf +* extensions.conf + +## Réseau + +Le protocole SIP utilise principalement le port UDP/5060 + des ports UDP divers... + +## Mode CLI + +Recharger la configuration Asterisk : + +~~~ +*CLI> reload +~~~ + + +### SIP + +Lister les connexions SIP entrantes/sortantes : + +~~~ +*CLI> sip show peers +Name/username Host Dyn Nat ACL Port Status +[...] +~~~ + +Détails sur une connexion SIP particulière : + +~~~ +*CLI> sip show peer +~~~ + +Lister les channels : + +~~~ +*CLI> sip show channels +Peer User/ANR Call ID Format Hold Last Message Expiry +1.2.3.4 (None) 53fa8add1dd3cba 0x0 (nothing) No Rx: OPTIONS +192.168.0.21 (None) 32e1708b-5b55-4 0x0 (nothing) No Rx: REGISTER +2 active SIP dialogs +~~~ + +Mode debug on / off pour SIP : + +~~~ +*CLI> sip set debug on +SIP Debugging enabled +*CLI> sip set debug off +SIP Debugging Disabled +~~~ + +### Plan de numérotation + +Voir le plan de numérotation dans un contexte : + +~~~ +*CLI> dialplan show default +[ Context 'default' created by 'pbx_config' ] + '100' => 1. Answer() [pbx_config] + 2. Playback(demo-echotest) [pbx_config] + 3. Echo() [pbx_config] + 4. Playback(demo-echodone) [pbx_config] + 5. Hangup() [pbx_config] +[...] +~~~ + +Recharger le plan de numérotation : + +~~~ +*CLI> dialplan reload +Dialplan reloaded. +~~~ + +## Meeting Room + +Pour avoir des meeting rooms, il est nécessaire d'avoir le module DAHDI + +~~~ +# aptitude install linux-headers-`uname -r` dahdi-source asterisk-dahdi +# m-a a-i dahdi +# modprobe dahdi_dummy +# chown -R asterisk: /dev/dahdi/ +~~~ + +On peut ainsi configurer via meetme.conf : + +~~~ +conf => 1 +conf => 2 +conf => 3,1234 +~~~ + +Et ensuite dans le plan de numérotation : + +~~~ +exten => 7001,1,MeetMe(1) +exten => 7002,1,MeetMe(2) +exten => 7003,1,MeetMe(3) +~~~ + +On peut lister les meeting rooms : + +~~~ +Meetme list +Conf Num Parties Marked Activity Creation Locked +2 0002 N/A 00:11:55 Static No +1 0001 N/A 00:53:33 Static No + +* Total number of MeetMe users: 3 +~~~ + +On peut lister les participants à une meeting room ...et même killer (pratique en cas de bug d'un utilisateur non déconnecté) : + +~~~ +Meetme list 1 +Meetme kick 1 8 +~~~ + +## Configuration téléphones + +Pour les téléphones Linksys/CISCO (SPA922, SPA901, SPA512G, SPA3102, PAP2T, etc.). + +On crée un entrée dans sip.conf : + +~~~ +[telephone1] +type=friend +host=dynamic +username=LOGIN +secret=PASS +quality=yes +nat=no +canreinvite=no +dtfmode=rfc2833 +allow=ulaw +~~~ + +Puis on configure le téléphone ainsi : + +~~~ +EXT1 + +Proxy : IP +Register : yes +Display Name : telephone1 +User ID : LOGIN +Password : PASS +use Auth ID : no +Auth ID : LOGIN +~~~ + + +### Magic code Cisco / Linksys + +Composer `****` puis : + +~~~ +110# : IP address +73738# puis 1 : reset +7932# puis 1 : enable web on WAN +~~~ \ No newline at end of file diff --git a/HowtoAtom.md b/HowtoAtom.md new file mode 100644 index 00000000..e50d8103 --- /dev/null +++ b/HowtoAtom.md @@ -0,0 +1,7 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Atom + + + +à compléter :) \ No newline at end of file diff --git a/HowtoBNX2.md b/HowtoBNX2.md new file mode 100644 index 00000000..4748f2bd --- /dev/null +++ b/HowtoBNX2.md @@ -0,0 +1,14 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +bnx2 et bnx2x sont des firmwares utilisés (entre autres ?) par les cartes Broadcom NetXtreme II : +~~~ +0b:00.1 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20) +~~~ + +Étant donné que ceux-ci ne sont pas libre, il ne sont pas intégré dans l'installateur Debian et la carte réseau ne sera pas fonctionnelle. +Il est nécessaire de télécharger le firmware sous forme de .deb (nonfree) et de le placer à la racine d'une clé USB (qui peut être aussi bien en ext3 qu'en vfat). L'installateur Debian détectera automatiquement le paquet est l'utilisera. + +*Liens (suivant le modèle de la carte) :* + +* +* \ No newline at end of file diff --git a/HowtoBTRFS.md b/HowtoBTRFS.md new file mode 100644 index 00000000..c52a4251 --- /dev/null +++ b/HowtoBTRFS.md @@ -0,0 +1,74 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto BTRFS + +*_Wikipedia*_ +Btrfs (B-tree file system, prononcé ButterFS) est un système de fichiers des années 2010 fondé sur le Copy-On-Write (copie sur écriture en français) sous licence GNU GPL, développé conjointement par Oracle, Red Hat, Fujitsu, Intel, SUSE, STRATO AG (en) et autres. En 2012, alors qu'il n'était pas encore considéré comme tout-à-fait stable, un effort intense de développement et de test est fourni par la communauté afin de faire de Btrfs le successeur de ext4 et ext3, systèmes de fichiers habituels des distributions Linux. OpenSuse 13.2 propose dès son lancement Btrfs par défaut pour la partition racine afin d'assurer la sécurité et laisse le choix entre ext4 et XFS (plus rapide) pour /home. + +Btrfs offre les fonctionnalités suivantes absentes d'autres systèmes de fichiers : + +- Instantané (snapshots) +- somme de contrôle + +Ces caractéristiques sont importantes pour les systèmes Linux, serveurs comme postes clients, car les tailles de stockage comme les configurations tendent à augmenter et à se complexifier. + + +On commence par installer le paquet nécéssaire + +~~~ +apt install btrfs-tools +~~~ + +On formate la partition +~~~ +mkfs.btrfs /dev/sda9 +~~~ + +Montage +~~~ +echo "/dev/sda9 /backup btrfs defaults 0 0" >> /etc/fstab +mount /backup +~~~ + +On créé des subvolume +~~~ +btrfs subvolume create /backup/aaa +btrfs subvolume create /backup/bbb +~~~ + +Lister les subvolumes +~~~ +btrfs subvolume list /backup/ +~~~ + +On peut faire des snapshots +~~~ +btrfs subvolume snapshot /backup/aaa /backup/bbb/snapshot1 +~~~ + +On peut supprimer des subvolumes (et snapshots) +~~~ +btrfs subvolume delete /bbb/bbb/snapshot1 +~~~ + +Vérifier l'intégrité +~~~ +btrfs scrub start /backup/ +btrfs scrub status /backup/ +~~~ + +Check plus poussé sur une partition non montée +~~~ +btrfs check -p /dev/sda9 +~~~ + +Voir si la partition a présenté des erreurs +~~~ +btrfs dev stats /backup +~~~ + +Sources : +[] +[] +[] +[] \ No newline at end of file diff --git a/HowtoBash.md b/HowtoBash.md new file mode 100644 index 00000000..0ff439c6 --- /dev/null +++ b/HowtoBash.md @@ -0,0 +1,28 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Astuces Bash + +~~~ +function hello { echo Hello; echo $1; } +~~~ + +## Raccourcis + +~~~ +Ctrl+d : quitte le terminal courant +Ctrl+a : aller en début de ligne +Ctrl+e : aller en fin de ligne +Ctrl+k : effacer (coupe) du curseur à la fin de la ligne +Ctrl+u : effacer (coupe) du début de ligne au curseur +Ctrl+y : colle la partie précédemment coupée +Ctrl+r : rechercher parmi l'historique +Ctrl+s : freeze l'affichage de l'output +Ctrl+q : défreeze l'affichage de l'affichage de l'output +Ctrl+t : inverse les caractères autour du curseur +Ctrl+c : annule la ligne en cours et passer sur une nouvelle ligne vide +Ctrl+z : suspend la tâche en cours +ctrl+l : efface/rafraichit l'écran +ctrl+x ctrl+e : édite la ligne dans $EDITOR +alt+effacer : Efface un mot à gauche du curseur +alt+d : Efface un mot à droite du curseur +~~~ \ No newline at end of file diff --git a/HowtoBenchmarks.md b/HowtoBenchmarks.md new file mode 100644 index 00000000..f714fcea --- /dev/null +++ b/HowtoBenchmarks.md @@ -0,0 +1,196 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Benchmarks + +*ATTENTION, CES TESTS NE DOIVENT PAS ÊTRE EFFECTUÉS SUR UN SERVEUR EN PRODUCTION* + +## Tests sur les performances du disque + +### dd + +On essaye plus ou moins de désactiver le cache mémoire pour l'écriture du filesystem +(en fait, le cache mémoire se remplit quand même pour optimiser une éventuelle lecture !) : + +~~~ +# echo 3 > /proc/sys/vm/drop_caches +# sysctl -w vm.dirty_background_ratio=0 +# sysctl -w vm.dirty_ratio=0 +~~~ + +Note importante : ces paramètres sont à activer avec précaution : ils peuvent dégrader les performances... +même pour les tests (en provoquant une sorte de yoyo en terme de vitesse d'accès). L'idéal est de tester via +un volume beaucoup plus grand que le taille de la mémoire du serveur. + +Performances en écriture : + +Un test simple est d'écrire un très gros fichier via la commande _dd_. + +~~~ +# time dd if=/dev/zero bs=4096 count=52398080 2>/tmp/out | pv > 200G ; cat /tmp/out + 200GB 0:24:40 [ 138MB/s] [ <=> ] + +real 24m40.378s +user 0m35.902s +sys 11m17.146s +52398080+0 records in +52398080+0 records out +214622535680 bytes (215 GB) copied, 1480.38 s, 145 MB/s +~~~ + +Note : la combinaison des options bs/count n'a apparemment que peu d'influence sur les résultats. + +Et en lecture : + +~~~ +# echo 2 > /proc/sys/vm/drop_caches +# time dd if=200G bs=4096 count=52398080 2>/tmp/out | pv > /dev/null ; cat /tmp/out + 200GB 0:09:13 [ 370MB/s] [ <=> ] + +real 9m13.131s +user 0m39.322s +sys 9m6.602s +52398080+0 records in +52398080+0 records out +214622535680 bytes (215 GB) copied, 553.056 s, 388 MB/s +~~~ + +Et en effacement : + +~~~ +# time rm /home/32gb + +~~~ + +### cryptsetup + +~~~ +# cryptsetup benchmark +# Tests are approximate using memory only (no storage IO). +PBKDF2-sha1 1024000 iterations per second +PBKDF2-sha256 668734 iterations per second +PBKDF2-sha512 344926 iterations per second +PBKDF2-ripemd160 624152 iterations per second +PBKDF2-whirlpool 182044 iterations per second +# Algorithm | Key | Encryption | Decryption + aes-cbc 128b 506.0 MiB/s 2019.3 MiB/s + serpent-cbc 128b 78.3 MiB/s 272.1 MiB/s + twofish-cbc 128b 166.4 MiB/s 321.7 MiB/s + aes-cbc 256b 405.2 MiB/s 1497.9 MiB/s + serpent-cbc 256b 81.7 MiB/s 272.2 MiB/s + twofish-cbc 256b 169.5 MiB/s 321.5 MiB/s + aes-xts 256b 1684.1 MiB/s 1688.8 MiB/s + serpent-xts 256b 279.3 MiB/s 268.1 MiB/s + twofish-xts 256b 311.6 MiB/s 317.7 MiB/s + aes-xts 512b 1304.0 MiB/s 1304.6 MiB/s + serpent-xts 512b 280.2 MiB/s 268.3 MiB/s + twofish-xts 512b 315.6 MiB/s 317.7 MiB/s +~~~ + +### Bonnie++ + +Bonnie++ est un utilitaire qui permet de faire un bench sur les disques en écrite/lecture de façon différente, par bloc, et par en mode « random ». + +Une bonne explication : + +Un exemple qui test le disque avec un fichier de 6Go ` bonnie++ -d ./ -s 6144`: + +~~~ +Version 1.96 ------Sequential Output------ --Sequential Input- --Random- +Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- +Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP +client 6G 607 99 50366 13 22989 4 2738 92 57663 7 109.1 5 +Latency 30503us 736ms 496ms 41723us 52395us 841ms +Version 1.96 ------Sequential Create------ --------Random Create-------- +client -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- + files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP + 16 20037 41 +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++ +Latency 21643us 2840us 4224us 1399us 481us 2791us +~~~ + +### iozone + +~~~ +$ iozone -T -t 4 -s 16g -r 256k -T -I -i0 -i1 -i2 +~~~ + +Crée 4 threads, dont chacun écrit et lit dans un fichier de 16Go, avec un buffer de 256Ko, utilisant O_DIRECT, pour désactiver le cache. + +~~~ +$ iozone -a -I -b test.ods +~~~ + +Fais tout les tests iozone en désactivant le cache, et en créant en fichier ODS pour faire un graphique des résultats, exemple : + +### pg_test_fsync + +~~~ +# aptitude install postgresql-contrib +~~~ + +~~~ +$ usr/lib/postgresql/9.2/bin/pg_test_fsync +2000 operations per test +O_DIRECT supported on this platform for open_datasync and open_sync. + +Compare file sync methods using one 8kB write: +(in wal_sync_method preference order, except fdatasync is Linux's default) + open_datasync n/a + fdatasync 3806.232 ops/sec + fsync 3096.090 ops/sec + fsync_writethrough n/a + open_sync 3523.832 ops/sec + +Compare file sync methods using two 8kB writes: +(in wal_sync_method preference order, except fdatasync is Linux's default) + open_datasync n/a + fdatasync 2974.951 ops/sec + fsync 2238.596 ops/sec + fsync_writethrough n/a + open_sync 1777.819 ops/sec + +Compare open_sync with different write sizes: +(This is designed to compare the cost of writing 16kB in different write open_sync sizes.) + 16kB open_sync write 3608.877 ops/sec + 8kB open_sync writes 2009.499 ops/sec + 4kB open_sync writes 1238.880 ops/sec + 2kB open_sync writes 135.783 ops/sec + 1kB open_sync writes 67.377 ops/sec + +Test if fsync on non-write file descriptor is honored: +(If the times are similar, fsync() can sync data written on a different descriptor.) + write, fsync, close 2962.546 ops/sec + write, close, fsync 3015.991 ops/sec + +Non-Sync'ed 8kB writes: + write 376151.965 ops/sec +~~~ + +### fio + + +/!\ Attention on fait les tests sur le disque, sans partition ou FS. /!\ + +~~~ + Read bandwidth: + fio --direct=1 --rw=randread --bs=1m \ + --size=5G --numjobs=4 --runtime=10 --group_reporting --name=file1 + + Read IOPS: + fio --direct=1 --rw=randread --bs=4k \ + --size=5G --numjobs=64 --runtime=10 --group_reporting --name=file1 + + Write bandwidth: + fio --direct=1 --rw=randwrite --bs=1m \ + --size=5G --numjobs=4 --runtime=10 --group_reporting --name=file1 + + Write IOPS: + fio --direct=1 --rw=randwrite --bs=4k \ + --size=5G --numjobs=64 --runtime=10 --group_reporting --name=file1 + + + read : io=1859.1MB, bw=190420KB/s, iops=47604 , runt= 10002msec + write: io=956556KB, bw=95627KB/s, iops=23906 , runt= 10003msec + + read : io=2632.0MB, bw=268952KB/s, iops=262 , runt= 10021msec + write: io=2258.0MB, bw=230827KB/s, iops=225 , runt= 10017msec +~~~ \ No newline at end of file diff --git a/HowtoBind.md b/HowtoBind.md new file mode 100644 index 00000000..97e3dba1 --- /dev/null +++ b/HowtoBind.md @@ -0,0 +1,469 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Bind +## Installation et configuration de Bind + +Sous Debian Squeeze, la version de Bind est 9.7.3 + +Afin d'installer Bind, lancez les commandes suivantes : + +~~~ +# aptitude install bind9 +~~~ + +L'installation terminée, débutez la configuration en exécutant le script chroot-bind.sh que vous aurez téléchargé +sur [], et placé dans /root : + +~~~ +# cd /root +# wget +# sh chroot-bind.sh +~~~ + +Ajoutez `-t /var/chroot-bind` dans la variable OPTIONS du fichier /etc/default/bind9 : + +~~~ +RESOLVCONF=no +OPTIONS=" -u bind -t /var/chroot-bind" +# Si pas d'IPv6 : +#OPTIONS="-4 -u bind -t /var/chroot-bind" +~~~ + + +Une fois fait, ouvrez le fichier /etc/bind/named.conf.options et modifiez et/ou ajoutez les lignes suivantes : + +~~~ +options { + directory "/var/cache/bind"; + + version "Bingo"; + auth-nxdomain no; + //listen-on-v6 { any; }; + + allow-query { localhost;}; + allow-recursion { localhost; }; + allow-transfer { localhost; }; + //allow-query { localhost; localnets; }; + //allow-recursion { localhost; localnets; }; + + //listen-on { 127.0.0.1; [IP LOCALE]; [IP PUBLIQUE];}; +}; + +logging { + //category default { default_syslog; default_debug; }; + category default { default_debug; }; + + channel default_syslog { + syslog daemon; + severity info; + }; + + channel default_debug { + file "/var/log/bind.log"; + severity debug; + }; +}; +~~~ + +Ensuite, créez le fichier /etc/bind/named.conf.acl et ajoutez des ACL du type + +~~~ +acl "ACL-kivabien" { + ::ffff:62.212.111.216; 62.212.111.216; // Nerim + ::ffff:88.179.18.233; 88.179.18.233; // Free + ::ffff:85.31.205.33; 85.31.205.33; + ::ffff:85.118.59.1; 85.118.59.1; +}; +~~~ + +Dans le fichier /etc/bind/named.conf, ajustez : + +~~~ +include "/etc/bind/named.conf.acl"; +include "/etc/bind/named.conf.options"; +~~~ + +Puis redémarrez Bind : + +~~~ +# /etc/init.d/bind9 restart +~~~ + +Créez le fichier /etc/bind/named.conf.local et ajouter le bloc de lignes suivant autant de fois que ce que vous comptez gérer de domaines en remplaçant 'example.com' par le domaine en question : + +~~~ +zone "example.com" { + type master; + file "/etc/bind/db.example.com"; + allow-query { any; }; + allow-transfer { "ACL-kivabien"; }; +}; +~~~ + +Ensuite, pour chaque bloc créé, il vous faudra créer autant de fichiers correspondant au 'file' de l'étape précédente, qui contiendra les lignes suivantes +(en remplacant les 'example.com' par votre domaine, et les '[IP PUBLIQUE]' par l'adresse IP numérique adéquate : + +~~~ +$TTL 1800 +@ IN SOA ns1.ns-example.com. dnsmaster.example.com. ( + 2011090101 ; serial + 2h ; rafraichissement slave->master + 1h ; en cas d'echec du refraichissement, nouvel essai + 5w ; expiration des enregistrements en cache par le slave + 10m ) ; TTL negatif + + IN A [IP PUBLIQUE] + + IN NS ns1.ns-example.com. + NS ns2.ns-example.com. + +; IN MX 10 mail + +ns1 IN A [IP PUBLIQUE] +;mail IN A [IP PUBLIQUE] + +www IN CNAME @ +ftp IN CNAME ftp.debian.org. +~~~ + +où ns1.ns-example.com correspond au nom du serveur primaire et dnsmaster.example.com correspond à un mail dnsmaster@example.com qui doit être valide. + +Poursuivez dans le fichier /etc/bind/named.conf et rajoutez la ligne suivante en toute fin de fichier : + +~~~ +include "/etc/bind/named.conf.CLIENT"; +~~~ + +Enfin, vérifiez que l'ensemble des fichiers que vous avez créé et/ou modifié sont bien en accès lecture pour l'utilisateur bind:bind, +soit par un chown, soit par un chmod 644. Redémarrez Bind par la commande : + +~~~ +# /etc/init.d/bind9 restart +~~~ + +Et testez avec _dig_ le couteau suisse du DNS ! + + +## Mise à jour dynamique + +Il est possible de mettre à jour une zone DNS avec nsupdate et une clef DNSSEC sans devoir éditer le fichier db. +Dans ce cas, Bind génère un ficher de journal binaire contenant l'historique des modifications apportées à la zone. +Ce fichier n'est pas "flushé" en temps réel et la zone au format texte peut être désynchronisée quelques temps après une modification (elle est mise à jour avec le journal environ toutes les 15min), il faut donc faire attention lors d'une mise à jour manuelle : + +~~~ +rndc freeze domain.tld +[Modification manuelle de la zone] +rndc thaw domain.tld +rndc reload domain.tld +~~~ + +## Rotation des logs + +Voici un exemple de configuration logrotate, qui effectue la rotation du fichier bind.log à l'intérieur du chroot : + +~~~ +/var/chroot-bind/var/log/bind.log { + weekly + missingok + rotate 4 + create 640 bind bind + sharedscripts + postrotate + rndc reload > /dev/null + endscript +} +~~~ + +## Reverse DNS + +Un reverse DNS est un nom de domaine associé à une adresse IP. Exemples : + +~~~ +$ dig -x 31.170.8.43 + +;; QUESTION SECTION: +;43.8.170.31.in-addr.arpa. IN PTR + +;; ANSWER SECTION: +43.8.170.31.in-addr.arpa. 43200 IN PTR hosting.evolix.net. + +$ dig -x 2a01:9500::3 + +;; QUESTION SECTION: +;3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.5.9.1.0.a.2.ip6.arpa. IN PTR + +;; ANSWER SECTION: +3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.5.9.1.0.a.2.ip6.arpa. 43200 IN PTR forge.evolix.net. +~~~ + +Cela fonctionne avec un nom de domaine "virtuel" : .in-addr.arpa en IPv4 et .ip6.arpa en IPv6 ! + +Et il est important de configurer les reverse DNS, car certains services les vérifient : Postfix, MySQL, CUPS, etc. +...notamment, sur un réseau avec des adresses privés qui ne doivent pas être propagés sur Internet ([ +des serveurs DNS de IANA répondent tout de même pour ces demandes... mais sans aucune garantie de bon fonctionnement !!](http://www.iana.org/abuse/answers)) + +On ajoutera ainsi systématiquement dans son named.conf.local : + +~~~ +zone "10.in-addr.arpa" { + type master; + file "/etc/bind/db.nxdomain"; +}; + +zone "168.192.in-addr.arpa" { + type master; + file "/etc/bind/db.nxdomain"; +}; + +zone "16.172.in-addr.arpa" { + type master; + file "/etc/bind/db.nxdomain"; +}; + +zone "17.172.in-addr.arpa" { + type master; + file "/etc/bind/db.nxdomain"; +}; + +[...] + +zone "30.172.in-addr.arpa" { + type master; + file "/etc/bind/db.nxdomain"; +}; + +zone "31.172.in-addr.arpa" { + type master; + file "/etc/bind/db.nxdomain"; +}; +~~~ + +Avec un fichier /etc/bind/db.nxdomain du type : + +~~~ +$TTL 1800 +@ IN SOA ns1.ns-example.com. dnsmaster.example.com. ( + 2011090101 ; serial + 2h ; rafraichissement slave->master + 1h ; en cas d'echec du refraichissement, nouvel essai + 5w ; expiration des enregistrements en cache par le slave + 10m ) ; TTL negatif + + IN NS ns1.ns-example.com. +~~~ + + +## Master/Slave + +Dans une configuration master/slave, un serveur DNS (le slave), réplique tout ou partie de ses fichiers de zone à partir d'un master. +Voici les directives à positionner pour cela : + +Sur le master, chaque zone devant être répliquée doit autoriser les transferts à partir du slave, à l'aide de la directive `allow-transfer`. Exemple : + +~~~ +zone "example.com" { + type master; + file "/etc/bind/db.example.com"; + allow-query { any; }; + allow-transfer { IP_DU_SLAVE; }; +}; +~~~ + +Sur le slave, chaque zone répliquée doit spécifier l'adresse IP du master à partir duquel le transfert sera fait, +et autoriser également les notifications de modification de zone provenant de celui-ci (directive `allow-notify`) : + +~~~ +zone "example.com" { + type slave; + file "/etc/bind/slave/example.com"; + masters { IP_DU_MASTER; }; + allow-query { any; }; + allow-notify { IP_DU_MASTER; }; +}; +~~~ + +Une fois cela en place, recharger la configuration du master puis du slave, et valider le bon fonctionnement en vérifiant la présence du fichier `/etc/bind/slave/example.com` que Bind doit créer. Effectuer également une vérification sur le slave à l'aide de l'outil dig par exemple. + +## Surveillance + +L'outil "dnstop" (paquet Debian du même nom), peut être utilisé pour analyser le trafic DNS d'un serveur. + +On lui passe en paramètre l'interface réseau sur laquelle écouter. Example : + +~~~ +# dnstop eth0 +~~~ + +### Munin + +Des plugins munin officiel permettent de tracer des courbes par rapport aux requêtes que le serveur à reçu. + +#### Graphs des accès via un fichier de log + +Pour cela il faut configurer une partie logs dans bind, simillaire à ceci : + +~~~ +logging { + channel query_logging { + file "/var/log/queries.log" versions 2 size 5M; + print-category yes; + print-severity yes; + print-time yes; + }; + category queries { query_logging; }; +~~~ + +Ensuite il faut configurer le [wiki:HowtoMunin#Lepluginbind plugin munin] pour lui dire d'aller lire ce fichier. + +#### Graphs des stats via rndc + +Configurer le chemin des statisques bind, dans `named.conf.options` + +~~~ +statistics-file "/var/cache/bind/named.stats"; +~~~ + +Ensuite il faut configurer le [wiki:HowtoMunin#Lepluginbind_rndc plugin munin] pour lui dire d'aller lire ce fichier. + +Assurez-vous du bon fonctionnement de la commande `rndc status` + +### Log2mail + +Pour être alerté en cas de fichiers de zone incorrect, on peut rajouter ceci dans la conf de log2mail : + +~~~ +file = /var/log/syslog +pattern = "not loaded due to errors" +mailto = postmaster@example.com +template = /etc/log2mail/template.bind +~~~ + +Et le contenu de _/etc/log2mail/template.bind_ : +~~~ +From: %f +To: %t +Subject: Bind problem + +Hello! + +We have matched your pattern "%m" in "%F" %n times: + +%l + +Yours, +log2mail. +~~~ + +## Bind et GeoIP + +On peut faire du GeoDNS de 2 façons avec Bind : + +* à l'aide de ce [patch](http://code.google.com/p/bind-geoip/). Le principe est de faire une recherche suivant un arbre binaire (binary search tree) sur la base de données de MaxMind. Cela n'impacte pas les temps de réponse mais nécessite de maintenir un Bind patché ; +* en se basant sur le système de vue/acl de Bind. Le principe est de récupérer les plages d'adresses par pays auprès de MaxMind et de générer des fichiers d'acl à l'aide de ce [script](http://phix.me/geodns/). Les performances sont en théorie moins bonnes (mais pas vraiment constaté dans la pratique), mais l'installation est bien plus simple à maintenir. + +### À l'aide de vues/acl + +* Récupérer le script : +~~~ +$ wget +~~~ + +* installer les dépendances nécessaires : +~~~ +# apt install python-mpmath +~~~ + +* exécuter le script. Il génèrera un fichier un fichier GeoIP.acl, avec une ACL par pays. Il est conseillé de l'exécuter avec un utilisateur Unix spécifique : +~~~ +$ ./GeoIP.py MaxMind +~~~ + +* Configurer Bind pour servir une zone différente en fonction des pays : +~~~ +include "/etc/bind/GeoIP.acl"; + +view "europe" { + match-clients { FR; }; + recursion no; + zone "example555.com" { + type master; + file "/etc/bind/db.example555-europe.db"; + allow-query { any; }; + }; +}; + +view "north_america" { + match-clients { US; CA; MX; }; + recursion no; + zone "example555.com" { + type master; + file "/etc/bind/db.example555-north-america.db"; + allow-query { any; }; + }; +}; + +view "other" { + match-clients { any; }; + recursion no; + zone "example555.com" { + type master; + file "/etc/bind/db.example555-other.db"; + allow-query { any; }; + }; +}; +~~~ + +Le script peut être mis en cron pour conserver des ACL à jour. + +## FAQ + +### journal out of sync + +Si vous avez une erreur du type : + +~~~ +journal out of sync with zone +~~~ + +Lancer la commande : + +~~~ +# named -g +~~~ + +Voir + +### ran out os space + +Si vous avez une erreur du type (par exemple pour des enregistrements TXT ou SPF) : + +~~~ +ran out os space +~~~ + +Vous devez spliter vos champs, voir + +### received control channel command 'stop' + +En lançant votre démon, celui-ci est stoppé immédiatement avec un simple message d'arrêt : + +~~~ +received control channel command 'stop' +~~~ + +...vérifiez si vous n'avez pas oublié l'option -f tout en utilisant systemd. + + +### Zone slave avec Bind 9.9 + +À partir de Bind 9.9, le stockage des zones slave se fait en binaire. +Avec une ancienne configuration vous aurez des : + +~~~ +zone example.com/IN: loading from master file /etc/bind/bak.example.com failed: not implemented +zone example.com/IN: unable to load from '/etc/bind/bak.example.com'; renaming file to '/etc/bind/db-5GoiCpdc' for failure analysis and retransferring. +~~~ + +Pour conserver l'ancien comportement il faut ajouter dans votre configuration : masterfile-format text; + +Voir diff --git a/HowtoBogofilter.md b/HowtoBogofilter.md new file mode 100644 index 00000000..ea2e293f --- /dev/null +++ b/HowtoBogofilter.md @@ -0,0 +1,44 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Bogofilter + +## Installation + +~~~ +# aptitude install bogofilter +~~~ + +## Apprentissage + +Avec une Maildir pleine de spams : + +~~~ +$ bogofilter -s -v -B Maildir/.verified-spams/ -o 0.99,0.01 +~~~ + +Avec une Maildir pleine de hams : + +~~~ +$ bogofilter -n -v -B Maildir/.verified-hams/ -o 0.99,0.01 +~~~ + +Mettre des termes à ignorer dans un fichier ignore.txt puis : + +~~~ +$ cd ~/.bogofilter +$ bogoutil -l ./ignorelist.db < ignore.txt +~~~ + +## Correction de l'apprentissage + +On repèrera tous les hams avec l'entête _X-Bogosity: Spam, tests=bogofilter, spamicity=1.000000_ que l'on mettra dans une Maildir : + +~~~ +$ bogofilter -Sn -v -B Maildir/.bogofilter-nonspam/ +~~~ + +Quant aux spams notés pas assez généreusement par Bogofilter : + +~~~ +$ bogofilter -Ns -v -B ~/Maildir/.bogofilter-spam/ -o 0.99,0.01 +~~~ diff --git a/HowtoBuildRPM.md b/HowtoBuildRPM.md new file mode 100644 index 00000000..490dd9b1 --- /dev/null +++ b/HowtoBuildRPM.md @@ -0,0 +1,306 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# How to create an RPM package + +Inspiré de + +Installation de tous les outils liés à la compilation. + +~~~ +# yum install @development-tools fedora-packager +~~~ + +Création d'un utilisateur spécifié, dédié à la création de paquet. + +~~~ +# /usr/sbin/useradd makerpm +# passwd makerpm +~~~ + +Une fois loggué avec cet utilisateur, mettre en place de l'environnement de création de paquets : + +~~~ +$ rpmdev-setuptree +~~~ + +Arbo : + + +~~~ +. +|-- BUILD +|-- RPMS +|-- SOURCES +|-- SPECS +`-- SRPMS + +~~~ + + +Fichier SPECS d'exemple : + + +~~~ +Summary: A program that ejects removable media using software control +Name: eject +Version: 2.1.5 +Release: 21%{?dist} +License: GPLv2+ +Group: System Environment/Base +Source: %{name}-%{version}.tar.gz +Patch1: eject-2.1.1-verbose.patch +Patch2: eject-timeout.patch +Patch3: eject-2.1.5-opendevice.patch +Patch4: eject-2.1.5-spaces.patch +Patch5: eject-2.1.5-lock.patch +Patch6: eject-2.1.5-umount.patch +URL: +ExcludeArch: s390 s390x +BuildRequires: gettext +BuildRequires: libtool + +%description +The eject program allows the user to eject removable media (typically +CD-ROMs, floppy disks or Iomega Jaz or Zip disks) using software +control. Eject can also control some multi-disk CD changers and even +some devices' auto-eject features. + +Install eject if you'd like to eject removable media using software +control. + +%prep +%setup -q -n %{name} +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 + +%build +%configure +make %{?_smp_mflags} + +%install +make DESTDIR=%{buildroot} install + +install -m 755 -d %{buildroot}/%{_sbindir} +ln -s ../bin/eject %{buildroot}/%{_sbindir} + +%find_lang %{name} + +%files -f %{name}.lang +%doc README TODO COPYING ChangeLog +%{_bindir}/* +%{_sbindir}/* +%{_mandir}/man1/* + +%changelog + +* Tue Feb 08 2011 Fedora Release Engineering - 2.1.5-21 +- Rebuilt for + +* Fri Jul 02 2010 Kamil Dudka 2.1.5-20 +- handle multi-partition devices with spaces in mount points properly (#608502) +~~~ + +On peut aussi générer un pseudo template en indiquant le nom du soft : + + +~~~ +cd ~/rpmbuild/SPECS +rpmdev-newspec python-antigravity +vi python-antigravity.spec +~~~ + +Une fois le fichier de spec créer, le tester : + + +~~~ +rpmlint program.spec +~~~ + +Si tout est OK, copier le fichier source (souvent un tar.gz en upstream) dans ~/rpmbuild/SOURCES/ + +Enfin pour créer le paqet : + + +~~~ +rpmbuild -ba program.spec +~~~ + + +Exemple avec nfdump pour le projet nagios-rt : + + +~~~ +Name: nfdump +Version: 1.6.6 +Release: 1%{?dist} +Summary: nfdump is a set of tools to collect and process netflow data + +Group: Applications/Internet +License: BSD License +URL: +Source0: +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +BuildRequires: flex,bison,byacc,rrdtool-devel + +%description +nfdump is a set of tools to collect and process netflow data. It's fast and has +a powerful filter pcap like syntax. It supports netflow versions v1, v5, v7 and +v9 as well as a limited set of sflow and is IPv6 compatible. IPFIX is supported +in beta state. For CISCO ASA devices, which export Netflow Security Event +Loging (NSEL) records, please use nfdump-1.5.8-2-NSEL. + + +%prep +%setup -q + + +%build +./configure --prefix=/usr --enable-nfprofile +make %{?_smp_mflags} + + +%install +rm -rf $RPM_BUILD_ROOT +make install DESTDIR=$RPM_BUILD_ROOT + + +%clean +rm -rf $RPM_BUILD_ROOT + + +%files +%{_bindir}/* +%{_mandir}/* +%defattr(-,root,root,-) +%doc + + + +%changelog +~~~ + + +~~~ +[makerpm@centos58 SPECS]$ rpmbuild -ba nfdump.spec +Exécution_de(%prep): /bin/sh -e /var/tmp/rpm-tmp.19407 ++ umask 022 ++ cd /home/makerpm/rpmbuild/BUILD ++ LANG=C ++ export LANG ++ unset DISPLAY ++ cd /home/makerpm/rpmbuild/BUILD ++ rm -rf nfdump-1.6.6 ++ /bin/gzip -dc /home/makerpm/rpmbuild/SOURCES/nfdump-1.6.6.tar.gz ++ tar -xf - ++ STATUS=0 ++ '[' 0 -ne 0 ']' ++ cd nfdump-1.6.6 +++ /usr/bin/id -u ++ '[' 501 = 0 ']' +++ /usr/bin/id -u ++ '[' 501 = 0 ']' ++ /bin/chmod -Rf a+rX,u+w,g-w,o-w . ++ exit 0 +Exécution_de(%build): /bin/sh -e /var/tmp/rpm-tmp.19407 ++ umask 022 ++ cd /home/makerpm/rpmbuild/BUILD ++ cd nfdump-1.6.6 ++ LANG=C ++ export LANG ++ unset DISPLAY ++ ./configure --prefix=/usr --enable-nfprofile +checking for a BSD-compatible install... /usr/bin/install -c +[...] +configure: creating ./config.status +config.status: creating Makefile +config.status: creating bin/Makefile +config.status: creating man/Makefile +config.status: creating config.h +config.status: executing depfiles commands + +* Many thanks for using nfdump tools +* You may want to subscribe to the nfdump-discuss and/or +* nfsen-discuss mailing list: +* +* +* Please send bug reports back to me: phaag@users.sourceforge.net +* or to one of the lists. ++ make -j3 +make all-recursive +[...] +make[1]: Leaving directory `/home/makerpm/rpmbuild/BUILD/nfdump-1.6.6' ++ exit 0 +Exécution_de(%install): /bin/sh -e /var/tmp/rpm-tmp.4807 ++ umask 022 ++ cd /home/makerpm/rpmbuild/BUILD ++ cd nfdump-1.6.6 ++ LANG=C ++ export LANG ++ unset DISPLAY ++ rm -rf /var/tmp/nfdump-1.6.6-1-root-makerpm ++ make install DESTDIR=/var/tmp/nfdump-1.6.6-1-root-makerpm +Making install in . +make[1]: Entering directory `/home/makerpm/rpmbuild/BUILD/nfdump-1.6.6' +make[2]: Entering directory `/home/makerpm/rpmbuild/BUILD/nfdump-1.6.6' +make[2]: Nothing to be done for `install-exec-am'. +make[2]: Nothing to be done for `install-data-am'. +make[2]: Leaving directory `/home/makerpm/rpmbuild/BUILD/nfdump-1.6.6' +make[1]: Leaving directory `/home/makerpm/rpmbuild/BUILD/nfdump-1.6.6' +Making install in bin +make[1]: Entering directory `/home/makerpm/rpmbuild/BUILD/nfdump-1.6.6/bin' +make install-am +make[2]: Entering directory `/home/makerpm/rpmbuild/BUILD/nfdump-1.6.6/bin' +make[3]: Entering directory `/home/makerpm/rpmbuild/BUILD/nfdump-1.6.6/bin' +test -z "/usr/bin" || /bin/mkdir -p "/var/tmp/nfdump-1.6.6-1-root-makerpm/usr/bin" + /usr/bin/install -c nfcapd nfdump nfreplay nfexpire nfanon nfprofile '/var/tmp/nfdump-1.6.6-1-root-makerpm/usr/bin' +make[3]: Nothing to be done for `install-data-am'. +make[3]: Leaving directory `/home/makerpm/rpmbuild/BUILD/nfdump-1.6.6/bin' +make[2]: Leaving directory `/home/makerpm/rpmbuild/BUILD/nfdump-1.6.6/bin' +make[1]: Leaving directory `/home/makerpm/rpmbuild/BUILD/nfdump-1.6.6/bin' +Making install in man +make[1]: Entering directory `/home/makerpm/rpmbuild/BUILD/nfdump-1.6.6/man' +make[2]: Entering directory `/home/makerpm/rpmbuild/BUILD/nfdump-1.6.6/man' +make[2]: Nothing to be done for `install-exec-am'. +test -z "/usr/share/man/man1" || /bin/mkdir -p "/var/tmp/nfdump-1.6.6-1-root-makerpm/usr/share/man/man1" + /usr/bin/install -c -m 644 ft2nfdump.1 nfcapd.1 nfdump.1 nfexpire.1 nfprofile.1 nfreplay.1 nfanon.1 sfcapd.1 '/var/tmp/nfdump-1.6.6-1-root-makerpm/usr/share/man/man1' +make[2]: Leaving directory `/home/makerpm/rpmbuild/BUILD/nfdump-1.6.6/man' +make[1]: Leaving directory `/home/makerpm/rpmbuild/BUILD/nfdump-1.6.6/man' ++ /usr/lib/rpm/find-debuginfo.sh /home/makerpm/rpmbuild/BUILD/nfdump-1.6.6 +extracting debug info from /var/tmp/nfdump-1.6.6-1-root-makerpm/usr/bin/nfanon +extracting debug info from /var/tmp/nfdump-1.6.6-1-root-makerpm/usr/bin/nfcapd +extracting debug info from /var/tmp/nfdump-1.6.6-1-root-makerpm/usr/bin/nfdump +extracting debug info from /var/tmp/nfdump-1.6.6-1-root-makerpm/usr/bin/nfprofile +extracting debug info from /var/tmp/nfdump-1.6.6-1-root-makerpm/usr/bin/nfexpire +extracting debug info from /var/tmp/nfdump-1.6.6-1-root-makerpm/usr/bin/nfreplay +2695 blocks ++ /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot ++ /usr/lib/rpm/redhat/brp-compress ++ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip ++ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump ++ /usr/lib/rpm/brp-python-bytecompile ++ /usr/lib/rpm/redhat/brp-java-repack-jars +Traitement des fichiers: nfdump-1.6.6-1 +Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 +Requires: libc.so.6()(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3)(64bit) libresolv.so.2()(64bit) librrd.so.4()(64bit) rtld(GNU_HASH) +Traitement des fichiers: nfdump-debuginfo-1.6.6-1 +Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 +Vérification des fichiers non empaquetés: /usr/lib/rpm/check-files /var/tmp/nfdump-1.6.6-1-root-makerpm +Ecrit: /home/makerpm/rpmbuild/SRPMS/nfdump-1.6.6-1.src.rpm +Ecrit: /home/makerpm/rpmbuild/RPMS/x86_64/nfdump-1.6.6-1.x86_64.rpm +Ecrit: /home/makerpm/rpmbuild/RPMS/x86_64/nfdump-debuginfo-1.6.6-1.x86_64.rpm +Exécution_de(%clean): /bin/sh -e /var/tmp/rpm-tmp.76791 ++ umask 022 ++ cd /home/makerpm/rpmbuild/BUILD ++ cd nfdump-1.6.6 ++ rm -rf /var/tmp/nfdump-1.6.6-1-root-makerpm ++ exit 0 +[makerpm@centos58 SPECS]$ + +~~~ + + diff --git a/HowtoCUPS.md b/HowtoCUPS.md new file mode 100644 index 00000000..4362f040 --- /dev/null +++ b/HowtoCUPS.md @@ -0,0 +1,120 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto CUPS + + + +## Installation + +~~~ +# aptitude install cups smbclient ttf-liberation ttf-mscorefonts-installer +~~~ + +## Configuration + +### Gestion des backends d'impression + +CUPS gère plusieurs backends d'impression : ipp:// socket:// (JetDirect) smb:// etc. + +Pour activer le backend smb:// il faut installer *smbclient* qui contient notamment le binaire _smbpool_. + +### Interface web d'administration + +L'interface web d'administration de CUPS est accessible sur le port 631 : + +* Autoriser l'utilisateur _foo_ à accéder aux tâches d'administration sur l'interface web : +~~~ +adduser foo lpadmin +~~~ + +* Par défaut, les tâches d'administrations ne sont autorisées que depuis _localhost_. Pour autoriser une IP ou réseau en plus : +~~~ +# Fichier /etc/cups/cupsd.conf + + + Order allow,deny + Allow from 192.0.32.0/24 + +~~~ + +### Détection automatique d'imprimantes partagées + +Par défaut CUPS tente de découvrir les imprimantes partagées par d'autres systèmes sur le réseau, et les affiche dans sa liste, avec une URI=/dev/null. Pour ne pas avoir ce comportement, décocher la case « Afficher les imprimantes partagées par d'autres systèmes » dans « Administration du serveur » dans l'interface d'admin, puis supprimer le cache : +~~~ +# /etc/init.d/cups stop && rm /var/cache/cups/remote.cache && /etc/init.d/cups start +~~~ + +### Mode debug + +Pour avoir un mode debug, on placera dans le fichier _cupsd.conf_ : + +~~~ +LogLevel debug +~~~ + +puis : + +~~~ +# /etc/init.d/cups reload +Reloading Common Unix Printing System: cupsd. +~~~ + +Et l'on aura un maximum d'information dans le _error_log_ + +## Imprimantes + +### Imprimantes HP + +~~~ +aptitude install hpijs hpijs-ppds hplip hplip-data +~~~ + +### Imprimantes CANON + +Les fichiers PPD peuvent être souvent trouvés sur + +Et il est parfois nécessaire d'ajouter le binaire _sicgsfilter_ téléchargeable en 32bits +sur ou en 64bits sur + + +On le placera dans /usr/local/bin/ et on évitera ainsi une erreur _/usr/lib/cups/filter/foomatic-rip failed_ : + +~~~ +D [02/Jun/2011:23:23:13 +0200] [Job 14496] renderer command: /bin/cat - | sicgsfilter -MPS -NP -A1 -uanonymous -V"Test Page" -n1 +D [02/Jun/2011:23:23:13 +0200] [Job 14496] +D [02/Jun/2011:23:23:13 +0200] [Job 14496] Closing renderer +D [02/Jun/2011:23:23:13 +0200] [Job 14496] JCL: +D [02/Jun/2011:23:23:13 +0200] [Job 14496] +D [02/Jun/2011:23:23:13 +0200] [Job 14496] sh: sicgsfilter: command not found +D [02/Jun/2011:23:23:13 +0200] [Job 14496] /bin/cat: write error: Broken pipe +D [02/Jun/2011:23:23:13 +0200] [Job 14496] renderer return value: 127 +D [02/Jun/2011:23:23:13 +0200] [Job 14496] renderer received signal: 127 +D [02/Jun/2011:23:23:13 +0200] [Job 14496] tail process done writing data to STDOUT +D [02/Jun/2011:23:23:13 +0200] [Job 14496] KID4 finished +D [02/Jun/2011:23:23:13 +0200] [Job 14496] Process dying with "The renderer command line returned an unrecognized error code 127.", exit stat: 1 +D [02/Jun/2011:23:23:13 +0200] [Job 14496] error: Illegal seek (29) +D [02/Jun/2011:23:23:13 +0200] [Job 14496] The renderer command line returned an unrecognized error code 127. +D [02/Jun/2011:23:23:13 +0200] [Job 14496] KID3 exited with status 1 +D [02/Jun/2011:23:23:13 +0200] [Job 14496] Renderer exit stat: 1 +D [02/Jun/2011:23:23:13 +0200] [Job 14496] Renderer process finished +D [02/Jun/2011:23:23:13 +0200] [Job 14496] Killing process 5546 (KID3) +D [02/Jun/2011:23:23:13 +0200] [Job 14496] Process dying with "Error closing renderer", exit stat: 1 +D [02/Jun/2011:23:23:13 +0200] [Job 14496] error: Illegal seek (29) +D [02/Jun/2011:23:23:13 +0200] [Job 14496] Error closing renderer +E [02/Jun/2011:23:23:13 +0200] PID 5541 (/usr/lib/cups/filter/foomatic-rip) stopped with status 1! +~~~ + +### Fichiers PPD (PostScript Printer Description) + +Les fichiers PPD décrivent les fonctionnalités de l'imprimante. Suivant les paquets installés, un certain nombre de modèles +d'imprimantes sera disponible sur le système. On pourra aussi en ajouter dans le répertoire _/usr/local/share/ppd/_. +Mais également lors de l'ajout d'une imprimante, on pourra tout simplement en uploader ; les fichiers PPD uploadés +se trouvent dans /etc/cups/ppd/ + +### Imprimer une page de test en CLI + +Lister les imprimantes : +`lpstat -t` + +Imprimer la page de test de CUPS avec lp, avec le nom de l'imprimante : +`lp -d hp_color_LaserJet_2550 /usr/share/cups/data/testprint` diff --git a/HowtoCacheHTTP.md b/HowtoCacheHTTP.md new file mode 100644 index 00000000..046e9f30 --- /dev/null +++ b/HowtoCacheHTTP.md @@ -0,0 +1,35 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Cache HTTP + + + +Entêtes relatifs au cache HTTP : + +~~~ +Cache-Control: +Max-Age: +Age: +Pragma: +Expires: +Last-Modified: +~~~ + +Exemple de mise en cache en PHP : + +~~~ +$offset=3600*20; //Forte période 20h +//$offset=3600*3; //Période normale 3h + +header("Cache-Control: public, max-age=$offset"); +header("Expires: " .gmdate("D, d M Y H:i:s",time()+$offset). " GMT"); +header("Last-Modified: " .gmdate("D, d M Y H:i:s",time()). " GMT"); +header("X-generated-at: " .date(DATE_RFC822)); +~~~ + +Exemple de non-mise en cache en PHP : + +~~~ +header("Pragma: no-cache"); +header("Cache-Control: no-cache"); +~~~ diff --git a/HowtoCacti.md b/HowtoCacti.md new file mode 100644 index 00000000..e819dd72 --- /dev/null +++ b/HowtoCacti.md @@ -0,0 +1,19 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Cacti + + + + +## FAQ + +* Réinitialiser un mot de passe avec MySQL ? Cela se passe dans la table user_auth et c'est encodé en MD5 (version 0.8.7) : + +~~~ +$ echo -n mynewpass | md5sum +4ef4d3b296aab9434da77e423cff3b8f +mysql> update cacti.user_auth set password='4ef4d3b296aab9434da77e423cff3b8f' where id=42; +~~~ + +* Sous Debian Lenny, pour que Cacti puisse générer correctement tous les graphes (surtout les previews), il faut indiquer dans les paramètres Cacti la bonne de version de RRDTool à utiliser : + Aller dans "Settings" > "RRDTool Utility Version" et sélectionner la version 1.2.x \ No newline at end of file diff --git a/HowtoCentOS/Installation.md b/HowtoCentOS/Installation.md new file mode 100644 index 00000000..cd88612f --- /dev/null +++ b/HowtoCentOS/Installation.md @@ -0,0 +1,26 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Gestion des packages + +Mise-à-jour des paquets : + +~~~ +# yum update +~~~ + +Ajouter le repository _rpmforge_ pour avoir des paquets supplémentaires (Munin, Nagios, etc.) : + +~~~ +# wget +# rpm -Uvh rpmforge-release-0.5.1-1.el5.rf.x86_64.rpm +~~~ + +Pour buider des paquets sources RPM : + +~~~ +# yum install rpm-build +# rpmbuild --rebuild *.src.rpm +~~~ + +Voir + diff --git a/HowtoCentOS/Reseau.md b/HowtoCentOS/Reseau.md new file mode 100644 index 00000000..5505bb6c --- /dev/null +++ b/HowtoCentOS/Reseau.md @@ -0,0 +1,40 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Réseau sous CentOS + + + +## Mode simple + +Avec une seule interface _eth0_, cela se passe dans le fichier _/etc/sysconfig/network-scripts/ifcfg-eth0_ : + +~~~ +DEVICE=eth0 +TYPE=Ethernet +BOOTPROTO=none +ONBOOT=yes +IPADDR=192.0.2.51 +NETMASK=255.255.255.0 +GATEWAY=192.0.2.254 +ETHTOOL_OPTS="autoneg off speed 100 duplex full" +~~~ + +Certaines directives globales comme le gateway, le hostname peuvent être mise dans _/etc/sysconfig/network_ + +~~~ +NETWORKING=yes +NETWORKING_IPV6=yes +HOSTNAME=foo.example.com +GATEWAY=192.0.2.254 +~~~ + +Pour gérer l'activation de l'interface : + +~~~ +# ifdown eth0 +# ifup eth0 +~~~ + +/!\ Attention il semblerait que CentOS garde l'ancienne IP si vous faites un changement d'adresse IP /!\ + +Vérifiez avec ` ip addr ` la présence de l'ancienne adresse IP et supprimer-la avec ` ip del @IP `. diff --git a/HowtoChiffrementData.md b/HowtoChiffrementData.md new file mode 100644 index 00000000..9b74f0c6 --- /dev/null +++ b/HowtoChiffrementData.md @@ -0,0 +1,133 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Chiffrement des données/partitions + +Inspiré de + +## Avec LUKS + +~~~ +# aptitude install cryptsetup +~~~ + +### Creation + +En renseignant un mot de passe manuellement : +~~~ +# cryptsetup --verbose --verify-passphrase luksFormat /dev/md7 + +WARNING! +======== +This will overwrite data on /dev/md7 irrevocably. + +Are you sure? (Type uppercase yes): YES +Enter LUKS passphrase: +Verify passphrase: +Command successful. +# cryptsetup luksOpen /dev/md7 crypt_md7 +Enter LUKS passphrase: +key slot 0 unlocked. +Command successful. +# mkfs.ext3 /dev/mapper/crypt_md7 +~~~ + +En utilisant un fichier comme clef de chiffrement : +~~~ +# dd if=/dev/random of=/root/.keyfile bs=1 count=256 +# cryptsetup --verbose --key-size=256 luksFormat /dev/md7 /root/.keyfile +~~~ + +### Utilisation + +Voir si une partition est de type LUKS : +~~~ +# cryptsetup isLuks /dev/hda7 +# cryptsetup luksDump /dev/hda7 +~~~ + +Ouvrir une partition chiffrée : +~~~ +# cryptsetup luksOpen /dev/mapper/vol1-crypto_test crypto_test +# cryptsetup luksOpen /dev/hda7 hda7_crypt +~~~ + + +Ouvrir une partition chiffrée avec un fichier de clef : +~~~ +# cryptsetup luksOpen --key-file /root/.keyfile /dev/md7 supersecretdata +~~~ + +Info sur la partition chiffrée : +~~~ +# cryptsetup status crypto_test +~~~ + +Fermer une partition chiffrée : +~~~ +# cryptsetup luksClose crypto_test +~~~ + +### Gestion des mots de passe + +Ajouter un mot de passe : +~~~ +# cryptsetup luksAddKey /dev/hda7 +Enter any LUKS passphrase: +key slot 1 unlocked. +Enter new passphrase for key slot: +Verify passphrase: +Command successful. +~~~ + +Rem : +Sur des vieilles versions, il fallait avoir la partition non dechiffrée : + +Pour supprimer un mot de passe, on regarde le n° du mot de passe avec : +~~~ +# cryptsetup luksDump /dev/hda7 +~~~ + +Puis on le supprime avec la commande : +~~~ +# cryptsetup luksKillSlot /dev/hda7 +~~~ + +Si l'entête du conteneur LUKS est corrompu, ceci rend la partition inutilisable + +Procédure pour Sauvegarde de l'entête : +Le fichier contenant la sauvegarde de l’entête est nommé ici backup-entete + +~~~ +# cryptsetup luksHeaderBackup --header-backup-file backup-entete /dev/hda7 +~~~ + +Pour Restaurer l'entête : + +~~~ +# cryptsetup luksHeaderRestore --header-backup-file backup-entete /dev/hda7 +~~~ + + +## FAQ + +Si vous obtnez un message de ce type : +~~~ +Command failed: Failed to setup dm-crypt key mapping. +Check kernel for support for the aes-cbc-essiv:sha256 cipher spec and verify that /dev/md1 contains at least 133 sectors +~~~ +La solution est : +~~~ +# modprobe dm-mod +~~~ + +## Notes sur les algorithmes de chiffrement + +Pour utiliser un algorithme de chiffrement spécifique, il faut le préciser au moment de la création de la partition : +~~~ +# cryptsetup --verbose --cipher=aes-cbc-essiv:sha256 --verify-passphrase luksFormat /dev/md7 +~~~ + +Le chiffrement aes-cbc-essiv est le chiffrement par défaut de cryptsetup pour les noyaux supérieurs au 2.6.10, car il corrige une vulnérabilité potentielle du chiffrement aes-cbc-plain. +Une autre méthode de chiffrement utilisée avec l'algorithme AES (Rijndael) est le mode XTS, qui est réputé plus résistants aux attaques par watermarking, mais nécessite un module spécifique (judicieusement nommé xts.ko) et une clef d'initialisation du double de la taille de la clef finale (voir + +Les autres algorithmes dignes d’intérêt sont twofish et serpent, deux compétiteurs de l'AES face à Rijndael. \ No newline at end of file diff --git a/HowtoCompression.md b/HowtoCompression.md new file mode 100644 index 00000000..0bb5ea37 --- /dev/null +++ b/HowtoCompression.md @@ -0,0 +1,30 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Compression + +## TAR + +Une astuce avec la commande tar est l'option -a qui permet d'autodétecter la compression selon le suffixe. Exemple : + +~~~ +$ tar cfa archive.tar.bz2 . +$ tar cfa archive.tar.lzma . +~~~ + +### LZMA + +#### Compression + +~~~ +tar cvfa dossier.tar.lzma dossier +OU +tar cvf dossier.tar.lzma dossier --lzma +~~~ + +#### Décompression + +~~~ +tar axvf dossier.tar.lzma +OU +tar xvf dossier.tar.lzma dossier --lzma +~~~ \ No newline at end of file diff --git a/HowtoCron.md b/HowtoCron.md new file mode 100644 index 00000000..f74eba39 --- /dev/null +++ b/HowtoCron.md @@ -0,0 +1,16 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + + +## Howto Cron + +Le programme cron est le planificateur de tâches standards sur systèmes UNIX. + +### Détection d'erreurs + +On peut ajouter la configuration suivante au logiciel log2mail pour détecter d'éventuelles erreurs de syntaxe dans /etc/crontab par exemple : + +~~~ +file = /var/log/cron.log + pattern = "Error" + mailto = root +~~~ \ No newline at end of file diff --git a/HowtoCrontab.md b/HowtoCrontab.md new file mode 100644 index 00000000..ed8503b5 --- /dev/null +++ b/HowtoCrontab.md @@ -0,0 +1,45 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Crontab + +## Gestion de votre crontab + +Via un accès SSH, vous pouvez gérer votre crontab. + +Pour lister votre crontab : + +~~~ +$ crontab -l +~~~ + +Pour éditer votre crontab via l'éditeur par défaut (souvent Vim) : + +~~~ +$ crontab -e +~~~ + +Note : attention, _crontab -r_ efface définitivement toute votre crontab, donc méfiez-vous car la touche "r" est proche de la touche "e" en Azerty/Qwerty. + +Pour éditer votre crontab via un autre éditeur (par exemple pico) : + +~~~ +$ EDITOR=pico crontab -e +~~~ + +## Exemples de crontab + +Attention, si une ligne de votre crontab a une syntaxe incorrecte, toute votre crontab risque d'être considérée comme invalide. + +Veuillez également lire ces conseils : [wiki:DevWeb#Scriptsencrontab] + +Lancer la commande _date_ tous les jours à minuit : + +~~~ +@daily date +~~~ + +Lancer la commande tous les dimanches à 6h42 : + +~~~ +42 6 * * 0 date +~~~ \ No newline at end of file diff --git a/HowtoCumulus.md b/HowtoCumulus.md new file mode 100644 index 00000000..070c9db3 --- /dev/null +++ b/HowtoCumulus.md @@ -0,0 +1,473 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Cumulus + +Cumulus Linux est une distribution de Linux axée sur le réseau et basée sur Debian. +C'est un OS qui peut être installé sur un "Bare Metal Switch", c'est-à-dire un switch vendu sans OS. +Voir la liste du matériel compatible : + +Équivalence des commandes Cisco : + +Documentations : + + + + + +## Topologie + +Pour les exemples, je me baserai sur cette topologie, où une machine sera connectée à leaf1 et une autre à leaf2 : + +## Installation et démarrage des machines virtuelles sous KVM + +Téléchargement de l'image disque de la VM : + +Démarrage des machines avec des modifications des commandes données sur le site : + +leaf1 : + +~~~ +sudo /usr/bin/kvm -curses \ + -name leaf1 \ + -pidfile leaf1.pid \ + -smp 1 \ + -m 256 \ + -net nic,macaddr=00:01:00:00:01:00,model=virtio \ + -net user,hostfwd=tcp::1401-:22 \ + -netdev socket,udp=127.0.0.1:1602,localaddr=127.0.0.1:1601,id=dev0 \ + -device virtio-net-pci,mac=00:02:00:00:00:01,addr=6.0,multifunction=on,netdev=dev0,id=swp1 \ + -netdev socket,udp=127.0.0.1:1606,localaddr=127.0.0.1:1605,id=dev1 \ + -device virtio-net-pci,mac=00:02:00:00:00:02,addr=6.1,multifunction=off,netdev=dev1,id=swp2 \ + -netdev socket,udp=127.0.0.1:1611,localaddr=127.0.0.1:1609,id=dev2 \ + -device virtio-net-pci,mac=00:02:00:00:00:09,addr=6.2,multifunction=off,netdev=dev2,id=swp3 \ + leaf1.qcow2 +~~~ + +leaf2 : + +~~~ +sudo /usr/bin/kvm -curses \ + -name leaf2 \ + -pidfile leaf2.pid \ + -smp 1 \ + -m 256 \ + -net nic,macaddr=00:01:00:00:02:00,model=virtio \ + -net user,hostfwd=tcp::1402-:22 \ + -netdev socket,udp=127.0.0.1:1604,localaddr=127.0.0.1:1603,id=dev0 \ + -device virtio-net-pci,mac=00:02:00:00:00:03,addr=6.0,multifunction=on,netdev=dev0,id=swp1 \ + -netdev socket,udp=127.0.0.1:1608,localaddr=127.0.0.1:1607,id=dev1 \ + -device virtio-net-pci,mac=00:02:00:00:00:04,addr=6.1,multifunction=off,netdev=dev1,id=swp2 \ + -netdev socket,udp=127.0.0.1:1612,localaddr=127.0.0.1:1610,id=dev2 \ + -device virtio-net-pci,mac=00:02:00:00:00:0A,addr=6.2,multifunction=off,netdev=dev2,id=swp3 \ + leaf2.qcow2 +~~~ + +spine1 : + +~~~ +sudo /usr/bin/kvm -curses \ + -name spine1 \ + -pidfile spine1.pid \ + -smp 1 \ + -m 256 \ + -net nic,macaddr=00:01:00:00:03:00,model=virtio \ + -net user,hostfwd=tcp::1403-:22 \ + -netdev socket,udp=127.0.0.1:1601,localaddr=127.0.0.1:1602,id=dev0 \ + -device virtio-net-pci,mac=00:02:00:00:00:05,addr=6.0,multifunction=on,netdev=dev0,id=swp1 \ + -netdev socket,udp=127.0.0.1:1603,localaddr=127.0.0.1:1604,id=dev1 \ + -device virtio-net-pci,mac=00:02:00:00:00:06,addr=6.1,multifunction=off,netdev=dev1,id=swp2 \ + spine1.qcow2 +~~~ + +spine2 : + +~~~ +sudo /usr/bin/kvm -curses \ + -name spine2 \ + -pidfile spine2.pid \ + -smp 1 \ + -m 256 \ + -net nic,macaddr=00:01:00:00:04:00,model=virtio \ + -net user,hostfwd=tcp::1404-:22 \ + -netdev socket,udp=127.0.0.1:1605,localaddr=127.0.0.1:1606,id=dev0 \ + -device virtio-net-pci,mac=00:02:00:00:00:07,addr=6.0,multifunction=on,netdev=dev0,id=swp1 \ + -netdev socket,udp=127.0.0.1:1607,localaddr=127.0.0.1:1608,id=dev1 \ + -device virtio-net-pci,mac=00:02:00:00:00:08,addr=6.1,multifunction=off,netdev=dev1,id=swp2 \ + spine2.qcow2 +~~~ + +Ajout de deux machines : + +machine1, connectée à swp3 de leaf1 : + +~~~ +sudo /usr/bin/kvm -curses \ + -name machine1 \ + -pidfile machine1.pid \ + -smp 1 \ + -m 256 \ + -net nic,macaddr=00:01:00:00:05:00,model=virtio \ + -net user,hostfwd=tcp::1405-:22 \ + -netdev socket,udp=127.0.0.1:1609,localaddr=127.0.0.1:1611,id=dev0 \ + -device virtio-net-pci,mac=00:02:00:00:00:0B,addr=6.0,multifunction=off,netdev=dev0,id=eth1 \ + machine1.qcow2 +~~~ + +machine2, connectée à swp3 de leaf2 : + +~~~ +sudo /usr/bin/kvm -curses \ + -name machine2 \ + -pidfile machine2.pid \ + -smp 1 \ + -m 256 \ + -net nic,macaddr=00:01:00:00:06:00,model=virtio \ + -net user,hostfwd=tcp::1406-:22 \ + -netdev socket,udp=127.0.0.1:1610,localaddr=127.0.0.1:1612,id=dev0 \ + -device virtio-net-pci,mac=00:02:00:00:00:0C,addr=6.0,multifunction=off,netdev=dev0,id=eth1 \ + machine2.qcow2 +~~~ + +Nous pouvons ensuite nous connecter en SSH sur chacune des machines sur les ports 1401 à 1406. + +## Configuration de couche 3 + +Configuration avec du routage entre chaque switch. + +### Configuration dans /etc/network/interfaces + +Pour leaf1 et leaf2 : + +~~~ +auto swp1 + iface swp1 + address 10.2.1.X/32 + +auto swp2 + iface swp2 + address 10.2.1.X/32 + +auto swp3 + iface swp3 + address 10.4.1.X/24 +~~~ + +Pour spine1 et spine2 : + +~~~ +auto swp1 + iface swp1 + address 10.2.1.X/32 + +auto swp2 + iface swp2 + address 10.2.1.X/32 +~~~ + +Avec X = 1 pour leaf1, 2 pour leaf2, 3 pour spine1 et 4 pour spine2 + +### Quagga + +La configuration du routage se fait sous [wiki:HowtoQuagga Quagga]. + +Activer zebra et ospf dans /etc/quagga/daemons : + +~~~ +zebra=yes +ospfd=yes +~~~ + +Configurer ospf dans /etc/quagga/Quagga.conf : + +Pour leaf1 et leaf2 : + +~~~ +service integrated-vtysh-config + +interface swp1 + ip ospf network point-to-point + +interface swp2 + ip ospf network point-to-point + +router-id 10.2.1.X + +router ospf + ospf router-id 10.2.1.X + network 10.2.1.X/32 area 0.0.0.0 + network 10.4.1.0/24 area 0.0.0.0 +~~~ + +Pour spine1 et spine2 : + +~~~ +service integrated-vtysh-config + +interface swp1 + ip ospf network point-to-point + +interface swp2 + ip ospf network point-to-point + +router-id 10.2.1.X + +router ospf + ospf router-id 10.2.1.X + network 10.2.1.X/32 area 0.0.0.0 +~~~ + +## Configuration de couche 2 + +Configuration avec des VLAN et du Spanning-Tree. Trois VLAN : le 1 est le natif, le 5 où chaque switch a son IP, et le 10 où seuls les deux PCs ont leur IP. + +### Configuration dans /etc/network/interfaces + +Pour leaf1 et leaf2 : + +~~~ +auto swp1 + iface swp1 + +auto swp2 + iface swp2 + +auto swp3 + iface swp3 + bridge-access 10 + mstpctl-portadminedge yes + mstpctl-bpduguard yes + +auto bridge + iface bridge + bridge-vlan-aware yes + bridge-ports glob swp1-3 + bridge-stp on + bridge-vids 5 10 + bridge-pvid 1 + +auto bridge.5 + iface bridge.5 + address 10.0.5.X/24 +~~~ + +Pour spine1 et spine2 : + +~~~ +auto swp1 + iface swp1 + +auto swp2 + iface swp2 + +auto bridge + iface bridge + bridge-vlan-aware yes + bridge-ports glob swp1-2 + bridge-stp on + bridge-vids 5 10 + bridge-pvid 1 + +auto bridge.5 + iface bridge.5 + address 10.0.5.X/24 +~~~ + +Les ports swp1 et swp2 sont en mode trunk pour les vlan 1, 5 et 10 grâce à la configuration de bridge dont ils héritent. +Le port swp3 n'hérite plus de la configuration VLAN de bridge puisqu'il est configuré en mode access sur le vlan 10, le stp portfast et le bpduguard sont activés. +Le vlan 5 est configuré pour le réseau 10.0.5.0/24. + +### Vérifications + +Interfaces : + +~~~ +leaf1# netshow interface bridge +-------------------------------------------------------------------- +To view the legend, rerun "netshow" cmd with the "--legend" option +-------------------------------------------------------------------- + Name Mac Speed MTU Mode +-- ------ ----------------- ------- ----- --------- +UP bridge 00:02:00:00:00:01 N/A 1500 Bridge/L2 + + +------------------------- ---------------------- +STP Mode: RSTP / Single Instance +Root Port: RootSwitch +Ports in Designated Role: swp1-3 +Ports in Alternate Role: None +Root Priority: 32768 +Bridge Priority: 32768 +Last TCN: swp1 (0:00:31) +Bridge Type Vlan Aware Bridge + + +Ports in Forwarding State +--------------------------- +swp1-3 + + +Ports in Oper Edge Port State +------------------------------- +swp3 +~~~ + +~~~ +leaf1# netshow interface swp1 +-------------------------------------------------------------------- +To view the legend, rerun "netshow" cmd with the "--legend" option +-------------------------------------------------------------------- + Name Mac Speed MTU Mode +-- ------ ----------------- ------- ----- -------- +UP swp1 00:02:00:00:00:01 10G 1500 Trunk/L2 + + +Vlan List +----------- +1, 5, 10 + +Untagged Vlans +---------------- +1 + +Vlans In Designated State +--------------------------- +1, 5, 10 + +Vlans In Forwarding State +--------------------------- +1, 5, 10 + + +LLDP +------ ---- ------------- +swp1 ==== swp1(cumulus) +~~~ + +STP : + +~~~ +leaf1# mstpctl showbridge bridge +bridge CIST info + enabled yes + bridge id 8.000.00:02:00:00:00:01 + designated root 8.000.00:02:00:00:00:01 + regional root 8.000.00:02:00:00:00:01 + root port none + path cost 0 internal path cost 0 + max age 20 bridge max age 20 + forward delay 15 bridge forward delay 15 + tx hold count 6 max hops 20 + hello time 2 ageing time 300 + force protocol version rstp + time since topology change 68666s + topology change count 11 + topology change no + topology change port swp3 + last topology change port swp2 +~~~ + +~~~ +leaf1# mstpctl showport bridge + swp1 8.003 forw 8.000.00:02:00:00:00:01 8.000.00:02:00:00:00:01 8.003 Desg + swp2 8.001 forw 8.000.00:02:00:00:00:01 8.000.00:02:00:00:00:01 8.001 Desg + swp3 8.002 forw 8.000.00:02:00:00:00:01 8.000.00:02:00:00:00:01 8.002 Desg + +~~~ + +VLAN : + +~~~ +leaf1# bridge vlan show +port vlan ids +swp1 1 PVID Egress Untagged + 5 + 10 + +swp2 1 PVID Egress Untagged + 5 + 10 + +swp3 10 PVID Egress Untagged + +bridge 5 +~~~ + +### Explications des options et autres possibilités + +* _bridge-vlan-aware yes_ : activer les VLAN +* _bridge-stp on_ : activer STP +* _bridge-vids 5 10_ : trunk pour les vlan 5 et 10 +* _bridge-pvid 1_ : vlan natif +* _bridge-access 10_ : port d'accès pour le vlan 10 +* _mstpctl-portadminedge yes_ : activer le portfast +* _mstpctl-bpduguard yes_ : activer le BPDUguard +* _mstpctl-treeprio 32768_ : modifier la priorité STP du switch +* _mstpctl-treeportprio swp3=128_ : modifier la priorité STP d'un port +* _link-speed 100_ : régler la vitesse du port à 100M +* _link-duplex full_ : régler le mode full duplex + +Voir toutes les options disponibles avec la commande _ifquery --syntax-help_ + +### Boucle/Intervalle + +Possibilité d'utiliser des boucles directement dans /etc/network/interfaces : + +~~~ +%for v in [5,10,30]: + auto bridge.${v} + iface bridge.${v} + address 10.0.${v}.1/24 +%endfor +~~~ + +Ou + +~~~ +%for port, vlanid in zip(range(2, 20), range(2004, 2022)) : + auto swp${port} + iface swp${port} + bridge-access ${vlanid} +%endfor +~~~ + +Ou même un intervalle : + +~~~ +auto bridge.[1-2000] + iface bridge.[1-2000] + ATTRIBUT +~~~ + +### Modification à chaud + +Créer un bridge et y ajouter trois ports : + +~~~ +# brctl addbr bridge +# brctl addbr bridge.5 +# brctl addif bridge swp1 swp2 swp3 +# ip link set up dev bridge +# for I in {1..3}; do ip link set up dev swp$I; done +# brctl show +~~~ + +Ajouter une adresse IP : + +~~~ +# ip addr add 10.0.5.1/24 dev bridge.5 +~~~ + +Activer STP : + +~~~ +# brctl stp bridge on +~~~ + +Mettre un port en STP portfast et activer le BPDUguard : + +~~~ +# mstpctl setportadminedge bridge swp3 yes +# mstpctl setbpduguard bridge swp3 yes +~~~ + +Cependant, il n'y a pas de commandes pour modifier à chaud la configuration VLAN. Pour cela, il faut modifier le fichier /etc/network/interfaces puis prendre en compte les modifications avec _ifreload_ ou _ifup nom_interface_. Dans ce cas là, les précédentes modifications faites à chaud ne restent pas. \ No newline at end of file diff --git a/HowtoDHCP.md b/HowtoDHCP.md new file mode 100644 index 00000000..35d64b1d --- /dev/null +++ b/HowtoDHCP.md @@ -0,0 +1,80 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + + +## Failover DHCP master/master + +Ce mode permet à deux serveurs DHCP de fonctionner simultanément sur un même LAN. + +Les leases dynamiques sont alors partagés entre les 2 serveurs et synchronisés via un échange réseau entre les serveurs. En cas de panne de l'un deux, l'autre prend alors à sa charge l'ensemble des leases. + +Pour cela, il est nécessaire d'ajouter une section "failover" sur chacun des serveurs. Exemple : + +Master : + +~~~ +failover peer "dhcp-failover" { + primary; + address 192.0.2.1; + peer address 192.0.2.2; + port 647; + peer port 647; + max-response-delay 30; + max-unacked-updates 10; + load balance max seconds 3; + split 128; + mclt 1800; +} +~~~ + +Slave : + +~~~ +failover peer "dhcp-failover" { + secondary; + address 192.0.2.2; + peer address 192.0.2.1; + port 647; + peer port 647; + max-response-delay 30; + max-unacked-updates 10; + load balance max seconds 3; +} +~~~ + +Il est également nécessaire d'englober la directive "range" et les sections "host" dans une section "pool", et l'on déclarera celle-ci en mode failover. Exemple : + +~~~ +subnet 192.0.2.0 netmask 255.255.0.0 { + option routers 192.2.0.254; + + pool { + failover peer "dhcp-failover"; + range 192.0.2.100 192.0.2.200; + + host host1 { + hardware ethernet 08:00:1f:82:7a:72; + fixed-address 192.0.2.4 + } + + [...] +} +~~~ + +## Divers + +### Redémarrage sous OpenBSD + +Un SIGHUP ne semble pas fonctionner pour appliquer les changements de la configuration. + +Il est donc conseillé de l'arrêter et de le relancer. + +~~~ +ps aux | grep dhcpd +kill -15 PID_DU_PROCESSUS +~~~ + +Puis relancer le processus comme il était lancé, exemple : + +~~~ +/usr/sbin/dhcpd bnx0 +~~~ diff --git a/HowtoDUC.md b/HowtoDUC.md new file mode 100644 index 00000000..63608778 --- /dev/null +++ b/HowtoDUC.md @@ -0,0 +1,80 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowTo DUC + +Duc est un utilitaire pour analyser l'espace disque (le précédent projet du même développeur était philesight). + +## Installation + +Il n'y a pas de paquets officiel ou de Debian, il faut le compiler, cf. les instructions sur le site +En revanche, nous avons des paquets Evolix pour Squeeze, Wheezy et Jessie, il faut mettre dans son sources.list : + +~~~ +deb jessie/ +~~~ + + +## Utilisation + +Quelques exemples : + +Lancer une indexation de /backup/jails : + + +-H : Compte les mêmes inode une seule fois. + +-e : exclude les fichiers correspondant à la regex. + +~~~ +# duc index -H -d /backup/duc.idx /backup/jails +~~~ + +Afficher l'espace disque avec l'interface ncurses. (q pour quitter, flèche directionnelles pour naviguer). + +~~~ +# duc ui -d /backup/duc.idx /backup/jails +~~~ + +Afficher l'espace disque avec un « ls like ». + +~~~ +# duc ls -d /backup/duc.idx -Fg /backup/jails/ +~~~ + +Générer un graphique : + +~~~ +# duc graph -d /backup/duc.idx -o /tmp/duc.png -l8 -s 1920 /backup/jails/ +~~~ + +### En CGI + +Il suffit de créer ce petit script sh dans `/usr/lib/cgi-bin/duc.cgi`, de donner les bons droits et d'y accéder. + +~~~ +#!/bin/sh +/usr/bin/duc cgi -d /backup/duc.idx --list +~~~ + +~~~ +# chmod 755 /usr/lib/cgi-bin/duc.cgi +# chown www-data: /usr/lib/cgi-bin/duc.cgi +# chmod 640 /backup/duc.idx +# chgrp www-data /backup/duc.idx +~~~ + +#### Apache + +Apache traite les CGI par défaut dans cgi-bin, il n'y a donc rien à faire. + +#### NginX + +À priori impossible à part avec un wrapper CGI… + +### Cron + +Cron d'indexation journalier. + +~~~ +30 6 * * * duc index -q -d /backup/duc.idx /backup/jails && chmod 640 /backup/duc.idx && chgrp www-data /backup/duc.idx +~~~ \ No newline at end of file diff --git a/HowtoDebian/Backports.md b/HowtoDebian/Backports.md new file mode 100644 index 00000000..ab2944a9 --- /dev/null +++ b/HowtoDebian/Backports.md @@ -0,0 +1,81 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Debian backports + +Une distribution stable de Debian garde en permanence (ou presque) les mêmes versions des logiciels (c'est le principe d'une version stable). +Certaines versions plus récentes sont néanmoins distribuées via des paquets Debian de "backports". + +## Utilisation + +Pour disposer des backports, on ajoutera le dépôt Debian Backports dans un fichier */etc/apt/sources.list.d/backports.list* : + +Pour Jessie : + +~~~ +deb jessie-backports main +~~~ + +On utilisera de l' _APT pinning_ pour bénéficier des mises-à-jour via les mises-à-jour régulières en créant le fichier */etc/apt/preferences.d/backports* ainsi : + +~~~ +Package: * +Pin: release a=jessie-backports +Pin-Priority: 200 +~~~ + +*ATTENTION, ceci provoquera des mises-à-jours pour l'ensemble des paquets "backportés" ... ceci est déconseillé dans un cas général !* + +On conseille plutôt de préciser explicitement les paquets que l'on veut. Exemple _/etc/apt/preferences.d/backports_ où l'on n'utilisera que les paquets Samba des backports : + +~~~ +Package: * +Pin: release a=jessie-backports +Pin-Priority: 50 + +Package: samba samba-common samba-common-bin libwbclient0 +Pin: release a=jessie-backports +Pin-Priority: 999 +~~~ + +## Mise-à-jour du noyau Linux + +Pour Squeeze : +~~~ +deb squeeze-backports main contrib non-free +~~~ + +~~~ +# aptitude install linux-image-3.2.0-0.bpo.4-amd64 initramfs-tools=0.99~bpo60+1 linux-base=3.4~bpo60+1 firmware-bnx2=0.36+wheezy.1~bpo60+1 +~~~ + +## [Wheezy] Créer une image CD netinst avec un kernel backporté wheezy-backports + +~~~ +# aptitude install build-essential pbuilder bc debiandoc-sgml libbogl-dev glibc-pic libslang2-pic libnewt-pic genext2fs mklibs genisoimage dosfstools syslinux tofrodos mtools po4a bf-utf-source fakeroot crash kexec-tools makedumpfile kernel-wedge xorriso win32-loader librsvg2-bin libacl1 +~~~ + +~~~ +$ apt-get source debian-installer +$ cd debian-installer-20130613+deb7u2/build +~~~ + +config/amd64.cfg: +~~~ +KERNELVERSION = 3.16.0-0.bpo.4-amd64 +KERNELMAJOR = 3.16 +~~~ + +sources.list.udeb.local: +~~~ +deb wheezy main +deb wheezy main/debian-installer +deb wheezy-backports main/debian-installer +~~~ + +pkg-lists/netboot/amd64.cfg: +~~~ +#nic-extra-modules-${kernel:Version} +#floppy-modules-${kernel:Version} +multiarch-support +libacl1 +~~~ \ No newline at end of file diff --git a/HowtoDebian/Download.md b/HowtoDebian/Download.md new file mode 100644 index 00000000..bf40391c --- /dev/null +++ b/HowtoDebian/Download.md @@ -0,0 +1,32 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Créer un média d'installation de Debian + +Télécharger une ISO sur + +## Via clé USB + +Copier simplement vers le média *non partitionné* : + +~~~ +# cp debian-8.6.0-amd64-CD-1.iso /dev/sdb +# sync +~~~ + +# Créer un média Debian-Live + +Télécharger une ISO sur + +## Via clé USB + +Copier simplement vers le média *non partitionné* : + +~~~ +# debian-live-8.6.0-amd64-standard.iso /dev/sdb +# sync +~~~ + +Infos Debian-Live : + +* login # user, password live +* passer en azerty : apt install console-data \ No newline at end of file diff --git a/HowtoDebian/Install.md b/HowtoDebian/Install.md new file mode 100644 index 00000000..20917f37 --- /dev/null +++ b/HowtoDebian/Install.md @@ -0,0 +1,300 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Howto Installer Debian + +Nous avons installé des centaines de serveurs Debian passés en production. +Nous listons ici certaines modifications appliquées dans une optique d'optimisation et de sécurisation. +Attention, ces modifications ne sont pas forcément applicables dans le cas général ! + +### Avant d'installer + +Divers conseils : + +* Vérifiez la mémoire à l'aide de l'outil _memtest86_ +* Valider le bon fonctionnement de la machine avec un live-CD comme Knoppix +* Sauvegarder le MBR et la table des partitions +* Sauvegarder les éventuelles partitions contenant des utilitaires ! +* Tester les disques durs avec un outil comme _badblocks_ + +### Installation + +Via CD-ROM ou PXE, quelques commentaires sur nos choix : + +* Choisir _anglais/us_ pour la langue, notamment pour avoir des messages d'erreur en anglais et faciliter la recherche dans les moteurs de recherche +* Nous choisissions le miroir Debian _mirror.evolix.org_ hébergé par nos amis de l'Ecole Centrale de Marseille +* Le partitionnement est le grand moment d'une installation. Entre les habitudes et recettes de grand-mère, voici nos préconisations : + +~~~ +Sauf cas particuliers, optez pour 3 partitions primaires : + +200 M pour /boot +500 M pour / +10 G pour /var + +Ensuite, des partitions logiques : + +5 G pour /usr +500 M pour /tmp +500 M pour swap +500 M pour swap +~~~ + + Si nécessaire (pour des logs web par exemple) créer une partition /var/log de 10 G + + Si nécessaire pour des bases de données, créer une partition en LVM afin de bénéficier des snapshots pour une sauvegarde optimisée + + L'espace restant (en prenant l'habitude de garder 5 à 10 G d'espace libre) sera réservé pour /home de type LVM si besoin de flexibilité +* Le système de fichiers à choisir est _ext4_ sauf rares exceptions. +* Ne choisir d'installer aucun des meta-package proposé (décocher tout). + +### Configuration post-install + +Voici nos préconisations post-installation : + +* Régler le niveau de debconf à _low_ : + +~~~ +# dpkg-reconfigure -plow debconf +~~~ + +* Ajuster le contenu du fichier _sources.list_ : + +~~~ +deb wheezy main +deb wheezy/updates main +deb wheezy-updates main +#deb wheezy-proposed-updates main +#deb wheezy-backports main +# Paquets specifiques Evolix +#deb kernel/ +deb wheezy/ +#deb wheezy-backports/ +~~~ + + Puis ne pas oublier d'exécuter : + +~~~ +# aptitude update +~~~ + +* Désactiver _apt-get_ pour s'assurer que seul _aptitude_ sera utilisé (attention, ceci peut "casser" certains logiciels) + +~~~ +# dpkg-divert --add --rename --divert /usr/bin/apt-get.bak /usr/bin/apt-get +~~~ + +* Désactiver l'installation automatiques des paquets recommandés en ajoutant dans le fichier _/root/.aptitude/config_ : + +~~~ +aptitude ""; +aptitude::Suggests-Important "false"; +aptitude::Recommends-Important "false"; +~~~ + +* Si vous choississez de monter les partitions avec des permissions particulières (par exemple "read-only" pour _/usr_ et "noexec" pour _/tmp_), on peut automatiser les changements et afficher un avertissement, via le fichier _/etc/apt/apt.conf_ ou dans un fichier personnalisé placé dans _/etc/apt/apt.conf.d/_ : + +~~~ +DPkg { + // Warn the user about the auto remount of partitions. + Pre-Invoke { + "echo 'Remounting partitions. Are you sure? Else exit with ^C'; read REPLY; mount -oremount,exec /tmp && mount -oremount,rw /usr"; + }; + Post-Invoke { + "mount -oremount /tmp && mount -oremount /usr || exit 0"; + }; +} +~~~ + +* Installation de paquets ou mises-à-jour en pensant à bien regarder les paquets "recommandés" lors d'une installation… +* Installer Postfix, le meilleur serveur mail du monde : + +~~~ +# aptitude install postfix +~~~ + + Postfix sera configuré en en fonction de l'utilisation du serveur +* Installer un certain nombre de paquets indispensables (voir les dépendances du meta-package _serveur-base_ hébergé sur le repository Evolix, +ceci ne fonctionnera que si vous l'avez activé dans le _sources.list_) : + +~~~ +# aptitude install serveur-base ssh +~~~ + + Note : les paquets distribués par Evolix ne sont pas signés donc ne pas tenir compte des erreurs "untrusted packages" + + Note : pour _apt-listchanges_ choisir "pager" puis "both" et d'envoyer sur l'adresse de votre choix +* S'assurer que les services inutiles sont désactivés. Ceci n'est plus nécessaire depuis les dernières versions de Debian, mais par réflexe, on fera : + +~~~ +# aptitude purge portmap hotplug nfs-common pidentd +# update-inetd --disable discard,daytime,time,ident +~~~ + +* On choisira l'éditeur par défaut du système (Vim étant le meilleur éditeur du monde...) : + +~~~ +# update-alternatives --config editor +~~~ + +* Configurer les alias mail : + +~~~ +# getent passwd | cut -d":" -f1 | sed "s/$/: root/" > /etc/aliases +~~~ + + On ajustera ensuite les mails pour "root" vers l'adresse mail de votre choix. + Et on pourra ajouter les alias suivants : postmaster, abuse, et mailer-daemon. + Puis : + +~~~ +# newaliases +~~~ + +* Ajuster le fichier _/etc/fstab_ suivant les restrictions nécessaires. Par exemple : + +~~~ +proc /proc proc defaults 0 0 +/dev/sda1 /boot ext' defaults 0 2 +/dev/sda2 / ext4 defaults,errors=remount-ro 0 1 +/dev/sda3 /var ext4 defaults 0 2 +/dev/sda5 /usr ext4 defaults,ro 0 2 +/dev/sda6 /tmp ext4 defaults,noexec,nosuid,nodev 0 2 +/dev/sda7 none swap sw 0 0 +/dev/sda8 none swap sw 0 0 +tmpfs /var/tmp tmpfs defaults,noexec,nosuid,nodev 0 2 +tmpfs /var/lock tmpfs defaults,noexec,nosuid,nodev 0 2 +/dev/mapper/myvol1-home /home ext4 defaults,noexec,nosuid,nodev,usrquota,grpquota 0 2 +~~~ + + Note: notez que la partition /usr est montée en read-only par défaut ET que /var/tmp/ et /var/lock sont en TMPFS (ce qui signifie purgé à chaque reboot !!). +Ceci est complètement non-standard et contraire au FHS, donc n'appliquer cela que si vous savez ce que vous faites ! + +* Gestion des quotas. On supprimera le script _quotarpc_ inutile : + +~~~ +# update-rc.d -f quotarpc remove +~~~ + + Si besoin de gérer les quotas, outre l'activation dans le _fstab_ : + +~~~ +# quotaoff -a +# quotacheck -auvg +# quotaon -auvg +# edquota -t +~~~ + + Dans un environnement professionel, nous conseillons de mettre la période de grâce à 30 jours minimum. +* Gestion des ACL si besoin. Outre l'installation du paquet _acl_, on ajoutera l'option _acl_ dans le _fstab_ pour la partition concernée (probablement /home) +* Changer les heures par défaut dans le fichier /etc/crontab afin d'éviter des surcharges divers à des moments donnés. Par exemple, ainsi : + +~~~ +hourly à Xh13 +daily à 1h23 +weekly à 3h33 +monthly à 4h37 +~~~ + +* Par défaut, les journaux système sont gérés par _rsyslog_. Sa configuration devra être ajustée via le fichier _/etc/rsyslog.conf_ pour notamment activer les logs de cron ou encore désactiver l'écriture en double de certains journaux. +* Pour la rotation des logs système, depuis la dernière version, tout est géré via logrotate.d (et non plus savelog). Attention, les paramètres par défaut conservent très peu de temps certains journaux (quelques semaines voire quelques jours...) et il convient de les ajuster pour les conserver pendant un an (ni plus ni moins). D'autres ajustements peuvent être faits pour dater les fichiers de logs via des actions _postrotate_ de logrotate. +* Configuration de Munin via `/etc/munin/munin.conf`, notamment le hostname. + + Si le noyau est patché _grsec_, il faut ajouter les lignes suivantes dans le fichier /etc/munin/plugin-conf.d/munin-node : + +~~~ +[processes] +user root +~~~ + +* Pour avoir une machine toujours à l'heure, on utilise _ntp_ avec le fichier _/etc/ntp.conf_ : + +~~~ +server ntp.evolix.net +~~~ + +* Droits des utilisateurs +* /etc/profile Définir umask 027 ou umask 077 en fonction de l'utilisation du serveur (gestion de groupes ou non) +* /root/.bashrc Définir umask 077, les fichiers créés par root ne doivent pas être visibles par les utilisateurs ! +* /etc/sudoers Voir plus bas la partie sur _sudo_ +* /root Mettre les droits 0700 +* /usr/share/scripts Mettre les droits 0700 (répertoire spécifique aux scripts d'Evolix) +* /etc/adduser.conf Régler DIR_MODE +* Pour gérer les accès _root_, utiliser le logiciel _sudo_, avec une configuration du type : + +~~~ +# visudo + +Defaultsenv_reset, umask=0077 +User_Alias ADMIN = pnom1, pnom2, pnom3 +ADMIN ALL=(ALL) ALL +~~~ + +* Configurer SSH en interdisant l'accès _root_ direct dans le fichier sshd_config : + +~~~ +PermitRootLogin no +~~~ + + Il est également conseillé d'utiliser la directive AllowUsers pour restreindre l'accès à certains utilisateurs et certaines adresses IP : + +~~~ +AllowUsers pnom1@1.2.3.4 pnom1@::ffff:1.2.3.4 +~~~ + +* Soyons parano, on peut restreindre l'accès root à la 5e console ainsi : + +~~~ +# echo tty5 > /etc/securetty +~~~ + +* Installer _minifirewall_. Cela consiste à télécharger les fichiers (principalement _minifirewall_ et _firewall.rc_) à partir du repository GIT et les placer respectivement dans _/etc/init.d/_ et _/etc_. Il faut ensuite procéder aux ajustements dans le fichier _firewall.rc_ +* Créer le fichier /etc/init.d/alert5 suivant : + +~~~ +#!/bin/sh +date | mail -s'boot/reboot' mail@example.com +/etc/init.d/minifirewall start +~~~ + + Et activer tout cela : + +~~~ +# chmod +x /etc/init.d/alert5 /etc/init.d/minifirewall +# update-rc.d alert5 start 99 2 . +~~~ + +* Pour diverses raisons, on peut limiter le temps de connexion en plaçant une ligne _export TMOUT=3600_ dans le fichier /etc/profile. +* Enfin, il faut ajuster les droits les moins permissifs possibles. On utilisera par exemple : + +~~~ +# find /etc/ -perm -004 +~~~ + +* De la même façon au niveau réseau, on pourra tester les ports ouverts, par exemple avec l'une des commandes suivantes : + +~~~ +# netstat -a -u -t -n -p +# lsof -i +# time nmap -sS -O -T Insane -p 0- YOUR-IP +~~~ + +* Script *evomaintenance* : pour une administration à plusieurs, nous utilisons un script qui permet d'informer à chaque intervention et de retenir ces informations dans une base de données. Voici comment nous l'utilisons : + +~~~ +# aptitude install evomaintenance +~~~ + + Puis ajuster le fichier de configuration _/etc/evomaintenance.cf_ et autoriser ce script à se lancer sans mot de passe pour les administrateurs via sudo. On ajoutera donc dans le suoders : + +~~~ +Cmnd_Alias MAINT = /usr/share/scripts/evomaintenance.sh +ADMIN ALL=NOPASSWD: MAINT +~~~ + + Note : la règle finale doit être ajoutée à la fin pour avoir plus d'importance que les règles déjà en place. + + Pour l'utilisation, les administrateurs placeront dans leur fichier .profile ou .bashrc : + +~~~ +trap "sudo /usr/share/scripts/evomaintenance.sh" 0 +~~~ \ No newline at end of file diff --git a/HowtoDebian/MigrationLennySqueeze.md b/HowtoDebian/MigrationLennySqueeze.md new file mode 100644 index 00000000..f2df1530 --- /dev/null +++ b/HowtoDebian/MigrationLennySqueeze.md @@ -0,0 +1,378 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Migration Lenny -> Squeeze + +Release Notes i386 : + +Release Notes amd64 : + +## VERSIONS + +Passage de Lenny à Squeeze : + +MySQL 5.0.51 -> 5.1.49 + +PHP 5.2.6 -> 5.3.3 + +Apache 2.2.9 -> 2.2.16 + +Tomcat 5.5.26->6.0.35 + + +## APT + +* Le dépôt volatile de lenny n'existe plus, il faut utiliser à la place : +~~~ +deb squeeze-updates main +~~~ + +* Bien vérifier les paquets proposés à la suppression ! +* Dans certains cas particuliers, on pourra utiliser apt-get à la place d'aptitude, qui peut avoir une gestion différente... mais attention, + les opérations avec apt-get ne seront donc pas loguées dans /var/log/aptitude ! + +## Munin + +* Commenter toutes les lignes de /etc/apache2/conf.d/munin +* Modifier l'URL de domaine/machine.html vers domaine/machine/index.html +* S'assurer que Munin soit toujours accessible + +## Apache + +* Pour mod_ssl, il est désormais nécessaire d'avoir des directives SSLxxx dans chaque VH *:443 => il faut donc dupliquer ces directives dans les autres VHs... +* Bien s'assurer de la présence de la variable APACHE_LOG_DIR dans le fichier */etc/apache2/envvars* sous peine d'avoir des erreurs du type : + +~~~ +Starting web server: apache2Action 'start' failed. +The Apache error log may have more information. + failed! + +[error] (2)No such file or directory: could not open transfer log file /etc/apache2/${APACHE_LOG_DIR}/other_vhosts_access.log. +Unable to open logs +~~~ + +## PHP + +* Le module mhash n'existe plus (intégré dans PHP) : mhash.ini à supprimer donc +* methode goto apparait cf +* Les directives register_long_arrays et magic_quotes_gpc sont désormais deprecated : à voir avec le client si elles peuvent être supprimées. +* Les directives session_is_registered et session_register le sont egalement, elles peuvent cependant être remplacée facilement : +~~~ +// if (!session_is_registered ("variable")) +// est remplacée par +if (!isset($_SESSION["variable"])) + +// session_register("variable"); +// est remplacée par +$_SESSION["variable"] == TRUE; +~~~ + +* possibilité de repasser à PHP5.2 sous Squeeze, cf +* L'affichage des warnings _PHP Deprecated_ peut être désactivé au niveau du virtualhost : +~~~ +# E_ALL & ~E_STRICT & ~E_DEPRECATED +php_admin_value error_reporting 22527 +~~~ + +## MySQL + +* L'option _skip-bdb_ n'existe plus, il faut la retirer du fichier _my.cnf_ +* S'assurer que _bind-address_ est bien resté le même (debconf peut reposer la question là-dessus) +* Erreur _ERROR 1577 (HY000) at line 1: Cannot proceed because system tables used by Event Scheduler were found damaged at server start_ : dans + ce cas, on peut supprimer la table _event_ qui sera recréée : _drop table mysql.event_ puis _mysql_upgrade --force_. Au pire, voici la table + sur une Squeeze : + +~~~ +CREATE TABLE `event` ( + `db` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', + `name` char(64) NOT NULL DEFAULT '', + `body` longblob NOT NULL, + `definer` char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', + `execute_at` datetime DEFAULT NULL, + `interval_value` int(11) DEFAULT NULL, + `interval_field` enum('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE','WEEK','SECOND','MICROSECOND','YEAR_MONTH','DAY_HOUR','DAY_MINUTE','DAY_SECOND','HOUR_MINUTE','HOUR_SECOND','MINUTE_SECOND','DAY_MICROSECOND','HOUR_MICROSECOND','MINUTE_MICROSECOND','SECOND_MICROSECOND') DEFAULT NULL, + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `last_executed` datetime DEFAULT NULL, + `starts` datetime DEFAULT NULL, + `ends` datetime DEFAULT NULL, + `status` enum('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL DEFAULT 'ENABLED', + `on_completion` enum('DROP','PRESERVE') NOT NULL DEFAULT 'DROP', + `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NOT NULL DEFAULT '', + `comment` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', + `originator` int(10) unsigned NOT NULL, + `time_zone` char(64) CHARACTER SET latin1 NOT NULL DEFAULT 'SYSTEM', + `character_set_client` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `collation_connection` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `db_collation` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `body_utf8` longblob, + PRIMARY KEY (`db`,`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Events'; +~~~ + +* Si il y a des instances MySQL, il faudra forcer le process d'upgrade de la base de données, par exemple : _mysql_upgrade --port=3307_ +* ATTENTION, un bug affecte MySQL à partir de 5.1, les noms de bases avec un '-' doivent être évités... car le cache MySQL ne fonctionne pas !!! Voir et + +## SHELL + +* Garder bash en shell sur /bin/sh ... sauf être vraimment sûr de soi ! (la question est posée par debconf) +* Attention /bin/false n'est plus listé dans /etc/shells (peut avoir des soucis pour PROFTPD) + +## ProFTPD + +* Le paquet peut être supprimé dans certains cas particulier + +## /etc/fstab + +* Upgrade du fstab en UUID : accepter a priori (pas de vrais problèmes rencontrés jusqu'ici...) + +## GRUB-2 ou GRUB-PC + +* Si celui-ci pose un soucis de type « out of partition » +* Ré-installer grub 1 avec le paquet grub-legacy +* Relancer l'installation à la main, taper grub puis +* root (hd0,0) +* setup (hd0) +* quitter et exécutez update-grub + +Si le "demi-passage" à GRUB2 se passe bien, on peut ensuite exécuter (puis rebooter) : + +~~~ +# upgrade-from-grub-legacy +# rm -f /boot/grub/menu.lst* +~~~ + +Note : avec Xen, on inversera l'ordre de linux et linux_xen pour avoir : + +~~~ +# ls /etc/grub.d/ +00_header 05_debian_theme 10_linux_xen 20_linux 30_os-prober 40_custom 41_custom README +~~~ + +## KERNEL avec GRSEC et GRUB + +Lors d'une mise-à-jour du noyau, vous rencontrez une erreur du type : + +~~~ +Searching for GRUB installation directory ... found: /boot/grub +User postinst hook script [update-grub] exited with value 137 +dpkg: error processing linux-image-2.6.26-2-amd64 (--configure): + subprocess post-installation script returned error exit status 137 +Errors were encountered while processing: + linux-image-2.6.26-2-amd64 + +# dmesg +PAX: From 192.0.43.10: execution attempt in: , 7cec1c0bc000-7cec1c0d1000 7ffffffea000 +PAX: terminating task: /usr/sbin/grub-probe(grub-probe):14743, uid/euid: 0/0, PC: 00007cec1c0cfe98, SP: 00007cec1c0cfe48 +PAX: bytes at PC: 41 bb 70 40 40 00 49 ba 90 fe 0c 1c ec 7c 00 00 49 ff e3 00 +PAX: bytes at SP-8: +grsec: From 192.0.43.10: denied resource overstep by requesting 4096 for RLIMIT_CORE against limit 0 for /usr/sbin/grub-probe[grub-probe:14743] uid/euid:0/0 gid/egid:0/0, parent /usr/sbin/update-grub[update-grub:14742] uid/euid:0/0 gid/egid:0/0 +PAX: From 192.0.43.10: execution attempt in: , 74d7be68f000-74d7be6a5000 7ffffffe9000 +PAX: terminating task: /usr/sbin/grub-probe(grub-probe):17804, uid/euid: 0/0, PC: 000074d7be6a3ac8, SP: 000074d7be6a3a78 +PAX: bytes at PC: 41 bb 70 40 40 00 49 ba c0 3a 6a be d7 74 00 00 49 ff e3 00 +PAX: bytes at SP-8: +grsec: From 192.0.43.10: denied resource overstep by requesting 4096 for RLIMIT_CORE against limit 0 for /usr/sbin/grub-probe[grub-probe:17804] uid/euid:0/0 gid/egid:0/0, parent /usr/sbin/update-grub[update-grub:17803] uid/euid:0/0 gid/egid:0/0 +~~~ + +Pour résoudre ce soucis : + +~~~ +# aptitude install paxctl +# paxctl -Cpermxs /usr/sbin/grub-probe +# aptitude upgrade +~~~ + +Lors d'une mise-à-jour du noyau, vous rencontrez une erreur du type : + +~~~ +update-initramfs: Generating /boot/initrd.img-2.6.32-5-amd64 +W: Possible missing firmware /lib/firmware/rtl_nic/rtl8105e-1.fw for module r8169 +W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168e-2.fw for module r8169 +W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168e-1.fw for module r8169 +W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168d-2.fw for module r8169 +W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168d-1.fw for module r8169 +~~~ + +Pour résoudre ce soucis ajouter les dépôts contrib et non-free dans le sources.list puis : + +~~~ +aptitude install firmware-realtek +update-initramfs -u -k all +~~~ + +Pour mettre un noyau Linux 3.2 issu des backports, on ajoutera donc au sources.list : + +~~~ +deb squeeze-backports main contrib non-free +~~~ + +Puis : + +~~~ +# aptitude install linux-image-3.2.0-0.bpo.1-amd64 linux-base=3.4~bpo60+1 initramfs-tools=0.99~bpo60+1 firmware-bnx2=0.35 firmware-bnx2x=0.35 +~~~ + + +## AWStats + +* Le fichier _/etc/cron.d/awstats_ pourrait être écrasé sans confirmation : par sécurité, sauvegarder le avant la mise-à-jour si vous l'avez modifié + +## Dovecot + +Si ce message s'affiche après la mise-à-jour : +~~~ +Error in configuration file /etc/dovecot/dovecot.conf line 680: Unknown setting: sieve Fatal: Invalid configuration +~~~ + +Il faut déplacer les options _sieve=_ et _sieve_storage=_ de la section _protocol managesieve_ vers la section _plugin_ + +Si c'est ce message : + +~~~ +Error in configuration file /etc/dovecot/dovecot.conf line 94: Unknown setting: ssl_disable +~~~ + +Il faut commenter l'option _ssl_disable = no_. + + +Si c'est ce message : + +~~~ +Error in configuration file /etc/dovecot/dovecot-ldap.conf line 120: Unknown setting: user_global_uid +~~~ + +Il faut s'assurer que tous les uids/gids des comptes virtuels soient à 5000/5000 dans ldap (ou en tout cas les même que le compte vmail) et commenter ces lignes. + +Enfin, pour un message du type : + +~~~ +Warning: fd limit 1024 is lower than what Dovecot can use under full load (more than 5696). Either grow the limit or change login_max_processes_count and max_mail_processes settings +~~~ + +Il faut augmenter le _ulimit -n_ dans /etc/default/dovecot + +On a également noté des soucis avec le paramètre _mail_plugins = quota imap_quota_ + +Si dans le mail.log vous avez pleins de warning sur des type de maildir non trouvé (dbox, cydir), il faut spécifier dans la conf que l'on utilise seulement une maildir : + +~~~ +mail_location = maildir:~/Maildir +~~~ + +Autre contrainte, dans le _dovecot.conf_, changer : + +~~~ +mail_plugins = cmusieve +~~~ + +en : + +~~~ +mail_plugins = sieve +~~~ + + +## Horde + +~~~ +Fatal error: Call to undefined method PEAR_Error::listFolder() in +~~~ + +Voir + +## Xen + +En passant à un kernel 2.6.32 dans le domU il faut changer sda en xvda (dans le paramètre _root=_ de la config de la VM et dans le fstab du domU) +et dans /etc/inittab du domu, changer _1:2345:respawn:/sbin/getty 38400 tty1_ en _1:2345:respawn:/sbin/getty 38400 hvc0_ + +## Courier IMAP + +Si vous avez une notification du type : + +~~~ +MAP server information: Filesystem notification initialization error -- contact your mail administrator (check for configuration errors with the FAM/Gamin library) +~~~ + +Installer le package fam : + +~~~ +# aptitude install fam +~~~ + +Attention, on peut théoriquement également installer aussi _gamin_ mais nous avons constaté des performances déplorables +(lenteurs avec des Maildir bien remplis, load élevé, etc.). Voir notamment + +Note : installer nscd ou nslcd peut également améliorer les performances, etc. + +## Samba + +Si LDAPS n'est pas utilisé, il est désormais obligatoire d'ajouter dans le smb.conf : + +~~~ +ldap ssl = off +~~~ + +Pour un fonctionnement avec FreeRadius + WINBIND, il faut désormais ajouter l'utilisateur _freerad_ +dans le groupe _winbindd_priv_ : + +~~~ +# adduser freerad winbindd_priv +~~~ + +Enfin, pour l'authentification NTLM dans le cadre d'une authentification Freeradius+EAP/MSCHAPv2+ntlm_auth : + +1. La version 3.5 de Samba ne gère plus l'authentification locale NTLM !!! + +On obtient : + +~~~ +NT_STATUS_INVALID_HANDLE: Invalid handle (0xc0000008) +~~~ + +Voir et + +Le bug est corrigé dans version 3.6 ! + +Si besoin, il faut donc passé à la version présente dans wheezy/sid (3.6.3 à ce jour, et pas encore backportée mais cela fonctionne) + +2. Mais même en 3.6, l'authentification machine ne fonctionne plus ! On obtient l'erreur : + +~~~ +NT_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT (PAM: 9) +~~~ + +À la lecture du code source de Samba (!), on voit le code suivant : + +~~~ + if (acct_ctrl & ACB_WSTRUST) { + if (!(user_info->logon_parameters & MSV1_0_ALLOW_WORKSTATION_TRUST_ACCOUNT)) { + DEBUG(2,("sam_account_ok: Wksta trust account %s denied by server\n", pdb_get_username(sampass))); + return NT_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT; + } + } +~~~ + +C'est apparemment une vérification d'envoi d'un flag lors de l'authentification machine. +En désactivant cette vérification (recompilation d'un paquet Samba sous Sid)... cela fonctionne. +Cela concerne précisément les paquets : samba samba-common samba-common-bin samba-tools winbind libwbclient0 + +Voir et + +## LDAP + +Un cas rencontré où _ldapsearch_ ne fait plus ses requêtes sur 127.0.0.1 par défaut : il a fallu rajouter explicitement _-h 127.0.0.1_ + +## Postgrey + +* Son port d'écoute change du 60000 vers le 10023 ! Il faut donc adapter la configuration de Postfix en conséquence ! +* Si Postgrey segfault, il faut supprimer ses données : rm /var/lib/postgrey/* cf + +## PAM_LDAP + +Il est conseillé d'utiliser le paquet _libpam-ldapd_ au lieu de _libpam-ldap_... mais si l'on veut mettre à jour l'attribut _shadowLastChange_ +via la commande *password*, il faut utiliser _libpam-ldap_ à cause du bug + +## Evomaintenance + +* Supprimer metche +* cd /etc/ && git init +* Ajouter les directives Git à _evomaintenance.sh_ diff --git a/HowtoDebian/MigrationSqueezeLTS.md b/HowtoDebian/MigrationSqueezeLTS.md new file mode 100644 index 00000000..0576010a --- /dev/null +++ b/HowtoDebian/MigrationSqueezeLTS.md @@ -0,0 +1,16 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Debian LTS + +Ajouter au sources.list : + +~~~ +deb squeeze-lts main +~~~ + +ou si besoin de non-free : + +~~~ +deb squeeze-lts main contrib non-free +~~~ + diff --git a/HowtoDebian/MigrationSqueezeWheezy.md b/HowtoDebian/MigrationSqueezeWheezy.md new file mode 100644 index 00000000..c3041323 --- /dev/null +++ b/HowtoDebian/MigrationSqueezeWheezy.md @@ -0,0 +1,443 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Migration Squeeze -> Wheezy + +Release Notes i386 : + +Release Notes amd64 : + +Attention, il est [recommandé](http://www.debian.org/releases/wheezy/amd64/release-notes/ch-upgrading.en.html#upgrading-full) d'utiliser _apt-get_ et non _aptitude_ : + + + +Avant de mettre à jour penser à vérifier les paquets étiquetés et suspendus et modifier si besoin : +~~~ +# apt-cache policy +# aptitude search "~ahold" +~~~ + +Commencer par télécharger l'ensemble des paquets qui devront être installés (afin de limiter le temps effectif d'installation). +~~~ +# apt-get dist-upgrade --download-only +~~~ + +Faire ensuite une mise à niveau "simple", pour appliquer les mises à jour triviales : + +~~~ +# apt-get upgrade +~~~ + +Enfin, appliquer les mises à jour non triviales (nécessitant des changements de paquets dépendants, des suppressions, ...) afin d'avoir un oeil plus précis sur ce qui sera fait, avant de valider : + +~~~ +# apt-get dist-upgrade +~~~ + +## VERSIONS + +Passage de Squeeze à Wheezy : + +MySQL 5.1.49 -> 5.5.53 + +PHP 5.3.3 -> 5.4.45 + +Apache 2.2.16 -> 2.2.22 + +Tomcat 6.0.35 -> 6.0.45 + +## /etc/securetty + +La syntaxe a changé. Si il y a des restrictions particulières, il faudra les remettre en place. + +## /etc/nagios/nrpe.cfg + +Si vous avez une erreur : +~~~ +nrpe: Cannot write to pidfile '/var/run/nrpe.pid' - check your privileges. +~~~ + +Workaround : modifier pid_file : +~~~ +pid_file=/var/run/nagios/nrpe.pid +~~~ + +## Shell + +Attention, vérifiez bien que le lien /bin/sh ne change pas de destination (de bash à dash) sans prévenir !! +On a constaté un cas où /bin/sh pointait vers dash après mise-à-jour alors que ça pointait vers bash avant. +Vérifier dans les backups vers quoi pointait /bin/sh avant l'upgrade + +## Apache + + n'existe plus par défaut : si il était vide mais que vous conservez votre ancien apache2.conf vous aurez une erreur du type : + +~~~ +Starting web server: apache2 +apache2: Syntax error on line 207 of /etc/apache2/apache2.conf: Could not open configuration file /etc/apache2/ No such file or directory +~~~ + +Workaround : touch /etc/apache2/ + +## /etc/sudoers + +Il est conseillé de migrer la configuration en utilisant /etc/sudoers.d/XXXX : + +## PHP + +### Directives obsolètes + +Les directives suivantes n'existe plus, il faut donc les commenter ou supprimer de la configuration. + +- allow_call_time_pass_reference [[BR]] + +- magic_quotes_gpc[[BR]] + +- register_long_arrays[[BR]] + + +### php5-suhosin + +The php5-suhosin package has been removed. If your PHP configuration included the suhosin module, it will fail to load after the PHP upgrade. Run dpkg --purge php5-suhosin to remove the leftover configuration in /etc/php5/conf.d/suhosin.ini. + + +## Evomaintenance + +/usr/share/scripts/evomaintenance.sh: 54: /usr/share/scripts/evomaintenance.sh: sendmail: not found + +Il faut soit mettre le path complet dans evomaintenance : /usr/sbin/sendmail + + +## Evoadmin Web + +Version de Squeeze incompatible avec Wheezy, il faut prendre la version GIT : + +Il faut mettre dans /etc/apache2/envvars + +~~~ +export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +~~~ + +## Dovecot + +La configuration de Dovecot est désormais découpée en Wheezy, cela peut donner des résultats +surprenants lors de la mise-à-jour. Il est conseillé de reprendre la configuration de zéro +ou preque. Bien penser à éditer différents fichiers : + +~~~ +# vim conf.d/10-auth.conf + +disable_plaintext_auth = no +!include auth-ldap.conf.ext + +# vim conf.d/15-lda.conf + +protocol lda { + auth_socket_path = /var/run/dovecot/auth-master + postmaster_address = postmaster@example.com +} + +# vim conf.d/10-ssl.conf + +ssl_cert = et + +### .my.cnf + +Si vous obtenez une erreur : + +~~~ +Warning: Using unique option prefix pass instead of password is deprecated and will be removed in a future release. Please use the full name instead. +~~~ + +Corrigez vos fichiers _.my.cnf_ pour mettre *password* à la place de *pass*. + +## base-passwd + +Si vous obtenez ce message : + +~~~ +update-passwd has found some differences between your system accounts +and the current Debian defaults. It is advisable to allow update-passwd +to change your system; without those changes some packages might not work +correctly. For more documentation on the Debian account policies please +see /usr/share/doc/base-passwd/README. + +The list of proposed changes is : +[...] +~~~ + +Il est conseillé de refuser et de conserver les uid/gid utilisés. + +## firmware bnx2 + +Rajouter non-free dans sources.list pour installer la mise à jour des firmwares bnx2. + +## Oracle + +Oracle veut utiliser /dev/shm en tmpfs, mais celui-ci a été déplacé en Wheezy, c'est maintenant /run/shm, avec un symlink vers /dev/shm, mais le symlink ne suffit pas ! Il faut donc revenir à l'ancienne méthode, pour cela on mettra dans le fstab : + + +~~~ +tmpfs /dev/shm tmpfs nosuid,nodev,size=50%,mode=1777 0 0 +~~~ + +## libnss LDAP + +Attention, si vous avez répondu YES à "Make the configuration file readable/writeable by its owner only?" le fichier /etc/libnss-ldapconf repassera en 600. + +Si nécessaire : + +~~~ +# chmod 644 /etc/libnss-ldapconf +# dpkg-reconfigure libnss-ldap +~~~ + + +## ProFTPD + +~~~ +proftpd[24268]: Fatal: LoadModule: error loading module 'mod_vroot.c': Operation not permitted on line 74 of '/etc/proftpd/modules.conf' +~~~ + +Désactiver le module _mod_vroot_ ou installer le paquet _proftpd-mod-vroot_. + +~~~ +proftpd[18591]: Fatal: unknown configuration directive 'LDAPDNInfo' on line 14 of '/etc/proftpd/ldap.conf' +proftpd[18591]: Fatal: unknown configuration directive 'LDAPDoAuth' on line 15 of '/etc/proftpd/ldap.conf' +~~~ + +Les directives _LDAPDNInfo_ et _LDAPDoAuth_ sont à remplacer par _LDAPBindDN_ et _LDAPUsers_. + +## Roundcube + +Si la mise à jour automatique de la bdd roundcube se passe mal, et que l'on a l'erreur "[Native message: Unknown column 'changed' in 'field list']" dans /var/log/roundcube/error.log : + +~~~ +# mysql +> use roundcube +> ALTER TABLE `identities` ADD `changed` DATETIME NOT NULL DEFAULT '1000-01-01 00:00:00' AFTER `identity_id`; +~~~ + +## Mailgraph + +Il faut appliquer ce patch pour /usr/share/scripts/mailgraph.sh + +~~~ +--- old 2015-06-11 18:01:16.476793959 +0200 ++++ mailgraph.sh 2015-06-11 17:59:05.926043623 +0200 +@@ -1,5 +1,6 @@ + #!/bin/sh + MAILGRAPH_PATH=/usr/lib/cgi-bin/mailgraph.cgi # Debian ++export SCRIPT_NAME="mailgraph.cgi" + #MAILGRAPH_PATH=/usr/local/www/cgi-bin/mailgraph.cgi # FreeBSD + #MAILGRAPH_PATH=/usr/local/lib/mailgraph/mailgraph.cgi # OpenBSD + +@@ -11,6 +12,7 @@ + + $MAILGRAPH_PATH | sed '1,2d ; s/mailgraph.cgi?//' > $MAILGRAPH_DIR/index.html + +-for i in 0-n 0-e 1-n 1-e 2-n 2-e 3-n 3-e; do ++for i in 0-g 1-g 2-g 3-g 0-n 0-e 1-n 1-e 2-n 2-e 3-n 3-e; do + QUERY_STRING=$i $MAILGRAPH_PATH | sed '1,3d' > $MAILGRAPH_DIR/$i + done +~~~ + +## Script Perl add.pl mail-add.pl + +Cas pack samba ou mail. Il faut patcher le script et installer une librairie. + + +~~~ +# aptitude install libdigest-sha-perl +# sed -i 's/SHA1/SHA/g' add.pl +~~~ + + + +~~~ +--- mail-add.pl 2015-08-31 09:27:24.000000000 +0200 ++++ /tmp/a 2015-08-31 09:37:00.000000000 +0200 +@@ -148,7 +148,7 @@ + my $result = $ldap->search( + base => $edn, + filter => "(uid=$ldapuid)", +- attrs => "uid" ++ attrs => ["uid"] + ); + + $result->code && die $result->error; +@@ -206,7 +206,7 @@ + $result = $ldap->search( + base => $edn, + filter => "(mailacceptinggeneralid=$mail)", +- attrs => "uid" ++ attrs => ["uid"] + ); + $result->code && die $result->error; + if ($result->entries) { +@@ -225,7 +225,7 @@ + $result = $ldap->search( + base => $edn, + filter => "(objectClass=posixAccount)", +- attrs => "uidNumber" ++ attrs => ["uidNumber"] + ); + $result->code && die $result->error; + my $uid = $minuid; # uidNumber initial +@@ -374,7 +374,7 @@ + $result = $ldap->search( + base => $dn, + filter => '(objectClass=posixGroup)', +- attrs => "gidNumber", ++ attrs => ["gidNumber"], + ); + $result->code && die $result->error; + my @entries = $result->entries; +@@ -492,7 +492,7 @@ + my $result = $ldap->search( + base => $edn, + filter => "(mailacceptinggeneralid=$alias)", +- attrs => "mailacceptinggeneralid" ++ attrs => ["mailacceptinggeneralid"] + ); + $result->code && die $result->error; + if ($result->entries) { +@@ -540,7 +540,7 @@ + my $result = $ldap->search( + base => $dn, + filter => "(objectClass=mailAccount)", +- attrs => "uid" ++ attrs => ["uid"] + ); + $result->code && die $result->error; + +@@ -590,7 +590,7 @@ + my $result = $ldap->search( + base => $dn, + filter => "(objectClass=mailAlias)", +- attrs => "mailacceptinggeneralid" ++ attrs => ["mailacceptinggeneralid"] + ); + $result->code && die $result->error; +~~~ + +## Asterisk + +Si vous utilisez le module "meetme" vous devrez désormais installer le paquet "asterisk-dahdi" + +## Sympa + +La config évolue : + +~~~ +#ScriptAlias /wws /usr/lib/cgi-bin/sympa/wwsympa.fcgi +ScriptAlias /wws /usr/lib/cgi-bin/sympa/wwsympa-wrapper.fcgi +~~~ + +avec les droits suivants : +~~~ +-rwxr-xr-x 1 sympa sympa 610018 janv. 17 2015 /usr/lib/cgi-bin/sympa/wwsympa.fcgi +-rwsr-sr-x 1 sympa sympa 6192 janv. 17 2015 /usr/lib/cgi-bin/sympa/wwsympa-wrapper.fcgi +~~~ + +## Evocheck + +Si *IS_DPKGWARNING_FAILED*, télécharger '/etc/apt/apt.conf.d/80evolinux' et supprimer '/etc/apt/apt.conf'. diff --git a/HowtoDebian/MigrationWheezyJessie.md b/HowtoDebian/MigrationWheezyJessie.md new file mode 100644 index 00000000..a0b8a3e2 --- /dev/null +++ b/HowtoDebian/MigrationWheezyJessie.md @@ -0,0 +1,320 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Migration Wheezy -> Jessie + +Release Notes amd64 : + +Avant de mettre à jour penser à vérifier les paquets étiquetés et suspendus et modifier si besoin : +~~~ +# apt-cache policy +# aptitude search "~ahold" +~~~ + +Éditer les dépôts dans /etc/apt/sources.list et /etc/apt/sources.list.d/*.list pour remplacer wheezy par jessie, puis mettre à jour la cache APT : +~~~ +# apt-get update +~~~ + +Commencer par télécharger l'ensemble des paquets qui devront être installés (afin de limiter le temps effectif d'installation). +~~~ +# apt-get dist-upgrade --download-only +~~~ + +Faire ensuite une mise à niveau "simple", pour appliquer les mises à jour triviales : + +~~~ +# apt-get upgrade +~~~ + +Enfin, appliquer les mises à jour non triviales (nécessitant des changements de paquets dépendants, des suppressions, ...) afin d'avoir un oeil plus précis sur ce qui sera fait, avant de valider : + +~~~ +# apt-get dist-upgrade +~~~ + +Bien vérifier que le noyau Linux a été mis à jour également : +~~~ +# uname -a # version qui tourne actuellement +# dpkg -l |grep linux-image # version nouvellement installée +~~~ + +Si la carte ethernet est un Broadcom, vérifier également que le paquet firmware-bnx2 a été mis à jour. + +Merger les nouvelles conf au cas par cas : +~~~ +# find /etc -name "*.dpkg-*" +~~~ + +## VERSIONS + +Passage de Wheezy à Jessie : + +MySQL 5.5.31 -> 5.5.43 + +PHP 5.4.4 -> 5.6.7 + +Apache 2.2.22 -> 2.4.10 + +Tomcat 7.0.28 -> 7.0.56 + +Bind 9.8.4 -> 9.9.5 + +noyau Linux 3.2 -> 3.16 + +## systemd + +Debian 8 utilise systemd par défaut. Pour passer effectivement en systemd (conseillé), il faut : + +~~~ +# apt install systemd-sysv +~~~ + +Informations de survie : + +* lire +* Repasser en sysV (non conseillé/testé) : + +Attention, le passage a systemd est délicat avec le démarrage réseau ! En effet, si des scripts liés au réseau sont démarrés via /etc/network/if-*up*/ vous aurez un blocage complet du démarrage... +Exemple : si le paquet openntpd est désinstallé et non purgé, votre démarrage sera bloqué => *dpkg -P openntpd* +Il faut donc vérifier que tous les scripts liés au réseau sont bien d'actualité : ls -l /etc/network/if-*up*/ +Plus de détails sur + +## Bind + +Si vous utilisez un chroot et systemd, vous devez (installer pkg _bind9_) -> voir + +~~~ +# cp -a /lib/systemd/system/bind9.service /etc/systemd/system/ +~~~ + +Ajuster la section [Service] : + +~~~ +EnvironmentFile=-/etc/default/bind9 +ExecStart=/usr/sbin/named -f $OPTIONS +~~~ + +Puis : + +~~~ +# systemctl daemon-reload +~~~ + +Autre information importante pour vos zones "slave" elles sont désormais binaires par défaut, +pour conserver les anciennes il faut donc ajouter l'option (par exemple dans /etc/bind9/named.conf.options) : + +~~~ +masterfile-format text; +~~~ + +## Redis + +/run n'est plus persistant. Il faut préciser dans l'unit de redis le RuntimeDirectory pour que la création de /var/run/redis soit effectuée au démarrage (et placer la socket et le pid dans /var/run/redis). + +~~~ +# cp -a /lib/systemd/system/redis-server.service /etc/systemd/system/ +~~~ + +Editer /etc/systemd/system/redis-server.service et ajuster la section [Service] : + +~~~ +RuntimeDirectory=redis +RuntimeDirectoryMode=700 +~~~ + +Puis : + +~~~ +# systemctl daemon-reload +~~~ + +## Apache + +* Il faut autoriser /home/ ou /srv dans /etc/apache2/apache2.conf ! + +~~~ +[Wed Nov 25 16:40:33.466946 2015] [authz_core:error] [pid 17204] [client XX.XX.XX.XX:48740] AH01630: client denied by server configura +tion: /home/XXX/www/YYY/ZZZ +~~~ + +~~~ + + Options Indexes FollowSymLinks + AllowOverride None + Require all granted + +~~~ + +* Il faut s'assurer que les fichiers dans /etc/apache2/sites-* se terminent en .conf sinon les renommer (ou modifier la directive dans apache2.conf) +* Il faut supprimer la directive : + +~~~ +AH00526: Syntax error on line 89 of /etc/apache2/apache2.conf: +Invalid command 'LockFile', perhaps misspelled or defined by a module not included in the server configuration +~~~ + +* Il faut supprimer les directives : + +~~~ +AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/ports.conf:8 +~~~ + +* Il faut remplacer ... + +~~~ +AH00526: Syntax error on line 5 of /etc/apache2/conf/ssl-evolix.conf: +SSLSessionCache: 'shm' session cache not supported (known names: default,shmcb). Maybe you need to load the appropriate socache module (mod_socache_shm?). +~~~ + +par + +~~~ +SSLSessionCache shmcb:/var/log/apache2/ssl_gcache_data(512000) +~~~ + +* Les directives Options doivent avoir + ou -. + +~~~ +AH00526: Syntax error on line 27 of /etc/apache2/sites-enabled/app: +Either all Options must start with + or -, or no Option may. +~~~ + +* RewriteLog et RewriteLogLevel n'existent plus, à supprimer + +~~~ +AH00526: Syntax error on line 61 of /etc/apache2/sites-enabled/app: +Invalid command 'RewriteLog', perhaps misspelled or defined by a module not included in the server configuration +~~~ + +*Il ne faut plus utiliser les directives MaxClients mais MaxRequestWorkers ! * + +### ModSec + +* deprecated: + +~~~ +ModSecurity: WARNING Using transformations in SecDefaultAction is deprecated (/etc/apache2/conf.d/mod-security2.conf:19 +~~~ + +Il faut mettre : + +~~~ +SecDefaultAction "log,auditlog,deny,status:406,phase:2" +~~~ + +* id + +~~~ +ModSecurity: Rules must have at least id action +~~~ + +Il faut rajouter des id aux rules. + +~~~ +# File name +SecRule REQUEST_FILENAME "modsecuritytest1" "id:1" +# Complete URI +SecRule REQUEST_URI "modsecuritytest2" "id:2" +SecRule REQUEST_FILENAME "(?:n(?:map|et|c)|w(?:guest|sh)|cmd(?:32)?|telnet|rcmd|ftp)\.exe" "id:3" +~~~ + +## Squid + +Attention Squid3 semble non compatible avec le kernel 3.2 de Wheezy, il faut bien rebooter sur le nouveau kernel pour que Squid soit fonctionnel. + +Pour installer le nouveau kernel, parfois nécessaire de préciser l'installation du kernel, en indiquant le package concerné : _linux-image-xx_ + +* APT UPDATE ne marche plus, et certains sites sont innaccessible (timeout): + +-> vérifier que tcp_outgoing_address est présent dans la conf de _Squid_ +-> mettre à jour `init.d/minifirewall` +-> restart minifirewall + +### Mettre à jour minifirewall + +Pour que squid fonctionne, il faut que la version de minifirewall soit récente. Auquel cas le message d'erreur suivant peut apparaître dans cache.log et squid ne démarre pas. + + +~~~ +2016/06/30 00:37:26 kid1| sendto FD 11: (1) Operation not permitted +2016/06/30 00:37:26 kid1| ipcCreate: CHILD: hello write test failed +~~~ + +Il manque une règle ip6tables. Cela a été corrigé via [ce commit](https://forge.evolix.org/projects/minifirewall/repository/revisions/705c4683a2d7214c3f9664577955f1dd32cfdf54/diff/minifirewall). + +*Il faut donc mettre à jour le script d'init minifirewall* ! + +## Elasticsearch + +Le fichier /etc/default/elasticsearch doit contenir les informations de configuration (il ne les a pas forcément par défaut !!) : + +~~~ +LOG_DIR=/var/log/elasticsearch +DATA_DIR=/var/lib/elasticsearch +WORK_DIR=/tmp/elasticsearch +CONF_DIR=/etc/elasticsearch +CONF_FILE=/etc/elasticsearch/elasticsearch.yml +ES_HOME=/usr/share/elasticsearch +ulimit -n 65535 +sysctl -q -w vm.max_map_count=262144 +~~~ + +Sinon, vous aurez notamment des erreurs du type : + +~~~ +elasticsearch[6821]: Failed to configure logging... +elasticsearch[6821]: org.elasticsearch.ElasticsearchException: Failed to load logging configuration +~~~ + +Il faut apparemment forcer l'activation au démarrage : + +~~~ +# systemctl enable elasticsearch +~~~ + +## Spamassassin + +SA peut gueuler, voir le package sa-compile qui n'arrive pas à s'installer. +Sans doute Razor plugin qui râle, donc vérifier le chargement de celui-ci : +~~~ +grep -ri razor /etc/spamassassin/local_evolix.cf +~~~ +-> commenter _razor_timeout_ (autre solution?) + +## MySQL + +Penser à ajouter la valeur par défaut à _secure-file-priv_ dans la config de MySQL (premier trouvé par ordre de préférence) : + +* /etc/mysql/conf.d/evolinux.cnf +* /etc/mysql/conf.d/evolix.cnf +* /etc/mysql/my.cnf +* /etc/mysql/conf.d/000-evolinux-defaults.cnf + +~~~ +[mysqld] +secure-file-priv = "" +~~~ + +## Redmine + +Lors de la migration, le package peut avoir été désinstallé. Regarder dans les logs dpkg: +~~~ +grep redmine /var/log/dpkg.log +~~~ + +Réinstaller le package, et s'assurer du PassengerDefaultUser pour www-data dans le mod apache2: +~~~ +$ vi /etc/apache2/mods-available/passenger.conf + PassengerDefaultUser www-data +~~~ + +Si besoin, changer _adapter_ de mysql vers mysql2 (avec package à installer si non présent) : `/etc/redmine/default/database.yml` + +## Evoadmin et web-add + +À cause de Apache 2.4 en Jessie, ils ne sont pas compatibles. Il faut installer la version de la branche Jessie. +Idéalement relancer le module evolinux jessie pour evoadmin (supprimer le vhost 'evoadmin' puis relancer evolinux en faisant grandement attention à ne valider que seulement l'installation de evoadmin-web). + +## rbenv + +Attention, une mise-à-jour majeure (tout comme une mise-à-jour majeure d'ailleurs) va casser les compilations (sauf coup de chance). diff --git a/HowtoDebian/Packages.md b/HowtoDebian/Packages.md new file mode 100644 index 00000000..5291184b --- /dev/null +++ b/HowtoDebian/Packages.md @@ -0,0 +1,137 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Debian packages + +## Gestion des packages + +Voir les évolutions de version proposées : + +~~~ +# aptitude upgrade -sV +~~~ + +### Packages held + + +~~~ +aptitude search ~ahold +~~~ + +## Unattended upgrades / Auto upgrades + +Sur un serveur non critique (backup, dev, …) on peut vouloir faire les mises à jour automatiquement. + +Pour cela il faut installer le paquet unattended-upgrades et faire « dpkg-reconfigure -plow unattended-upgrades ». + +La configuration se trouve dans /etc/apt/apt.conf.d/50unattended-upgrades. +On peut choisir où envoyer le mail de rapport ou encore si on doit redémarrer la machine automatiquement si nécessaire, etc. + + +## Créer un paquet Debian + +* Debian Policy : +* Debian Dev refs : +* Debian New Maint guide : +* Howto sur le wiki Debian : +* Howto de L. Nussbaum : + +### Génération de l'arborescence _debian/_ + +Cette étape consiste à créer une arborescence qui constituera le paquet Debian. On peut l'automatiser simplement avec la commande _dh_make_ : + +~~~ +cd futur-paquet-0.1 +dh_make +~~~ + +_NOTE : le nom du répertoire doit obligatoirement être de la forme _nom_-_version_ (_nom_ peut contenir des minuscules, chiffres et tirets)._ + +En utilisant dh_make sans options, il essayera de deviner les informations dont il a besoin. On peut forcer celles ci en les spécifiant sur la ligne de commande. Pour les plus utiles : + +* `-c` : la licence du programme ; +* `-e` : l'adresse email du responsable du paquet (vous) ; +* `-p` : nom du paquet, si le nom du répertoire courant n'est pas sous la forme standard ; +* `-f` : chemin vers l'archive contenant les sources. Si elle n'existe pas, utilisez l'option --createorig. + +Le type de paquet vous sera demandé lors de l'exécution. + +### Édition de certains fichiers importants + +_dh_make_ a créé de nombreux fichiers dans le répertoire _debian/_. Certains sont indispensables, d'autres moins. +Par exemple (si vous ne vous en servez pas) vous pouvez supprimer tous les *.ex, des templates servant d'exemple. + +~~~ +rm *.ex +rm *.EX +~~~ + +Voici une rapide explication à propos des fichiers importants : + +* le fichier _control_ : il décrit de manière générale le paquet. Plusieurs champs sont à compléter, notamment : +* _Section_ : voir la liste [ici](http://www.debian.org/doc/debian-policy/ch-archive.html#s-subsections) ; +* _Homepage_ : le site du programme ; +* _Architecture_ : _any_ par défaut, ce qui va générer un paquet par architecture. Dans le cas d'un script shell par exemple, on préférera _all_ (un seul paquet est généré car compatible avec toutes les architectures) ; +* _Depends_ : indiquez ici le nom et la version des paquets dont dépends éventuellement le programme (en général des bibliothèques) ; +* _Description_ : le champ doit contenir une description courte, suivi d'une description longue (sur la ligne suivante, indentée d'un espace). +* le fichier _changelog_ : il décrit les changements qui ont été fait sur le programme. À priori, il est déjà complété avec un « Initial release ». Supprimez juste le « (Closes: #nnnn) » puisque c'est la première version. +* le fichier _copyright_ : il contient la licence sous laquelle est distribué le programme. `dh_make` l'a partiellement remplit, il vous reste à indiquer le(s) développeur(s) du programme ainsi que le texte de la licence. +* le fichier _rules_ : c'est en fait un fichier Makefile, qui décrit les règles de construction et d'installation du paquet. Dans le cas d'un script unique, et qui ne nécessite pas de configuration/compilation : + +C'est le célèbre _./debian/rules_ qui gère donc la compilation et la copie des fichiers dans la future arborescence. +Si l'on simplement copier un script, on peut par exemple rajouter ceci à la fin de la cible _install_ : + +~~~ + install -d -m 0755 -o root -g root $(CURDIR)/debian/futur-paquet + install -m 0755 -o root -g root nom-du-script $(CURDIR)/debian/futur-paquet +~~~ + +### Construction du paquet + +Maintenant nous pouvons construire le paquet à l'aide de la commande : + +~~~ +$ debuild -us -uc +~~~ + +Si aucune erreur n'est apparue, votre paquet est prêt à être installé et/ou poussé sur un dépôt non officiel. + + +## Créer un paquet pour un module PHP Pear ou Pecl + +La commande `dh-make-pecl` (ou `dh-make-pear`) permet de télécharger l'archive depuis les dépôts PHP puis de créer l'arborescence du paquet Debian en pré remplissant certains fichiers (notamment le _debian/rules_) : +~~~ +dh-make-pecl --maintainer "John Doe " --only 5 pecl-package +~~~ + +## Manipulation d'un paquet (binaire) + +Pour certaines (mauvaises) raisons, on peut être amené à vouloir modifier un paquet binaire... notamment un maintainer script par exemple. + +~~~ +$ ar x foo.deb +$ ls +control.tar.gz data.tar.gz debian-binary +$ tar xf control.tar.gz +$ vim preinst + +$ tar cvf control.tar.gz md5sums postrm control prerm preinst postinst +$ ar r foo.deb control.tar.gz +~~~ + +Et voilà, on a modifié le _preinst_ du paquet _foo.deb_. + +## FAQ + +### Erreur lintian : mkdir -p failed at /usr/share/perl5/Lintian/Unpacker.pm line 224 + +~~~ +mkdir -p /tmp/temp-lintian-lab-6xngeaELBD/pool/d/devscripts/devscripts_2.13.8_amd64_binary failed at /usr/share/perl5/Lintian/Unpacker.pm line 224. +~~~ + +C'est probablement que votre système n'a pas assez de mémoire. +Avec un _strace lintian_ vous obtiendrez peut-être : + +~~~ +clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f09117029d0) = -1 ENOMEM (Cannot allocate memory) +~~~ + diff --git a/HowtoDebian/Passwd.md b/HowtoDebian/Passwd.md new file mode 100644 index 00000000..a9213952 --- /dev/null +++ b/HowtoDebian/Passwd.md @@ -0,0 +1,11 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Authentification sous Linux + +## shadow + +Note : attention, un mot de passe expiré signifie que les crons de l'utilisateur ne seront plus exécutés ! + +~~~ +Nov 23 10:00:01 hostname CRON[25023]: pam_unix(cron:account): expired password for user jdoe (password aged) +~~~ \ No newline at end of file diff --git a/HowtoDebian/Repository.md b/HowtoDebian/Repository.md new file mode 100644 index 00000000..fcb11514 --- /dev/null +++ b/HowtoDebian/Repository.md @@ -0,0 +1,189 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# How to Repository + +Il peut parfois être intéressant de disposer d'un dépôt Debian privé pour distribuer des packages qui ne sont pas prêts à être ajoutés à l'archive de Debian ou alors qui ne sont pas d'intérêt public. + +Il existe plusieurs manières de monter un dépôt Debian. Ce tutoriel explique comment monter un dépôt simple à utiliser avec `reprepro`. + +# Installer & configurer reprepro + +Avant de commencer, il est nécessaire d'installer `reprepro`: + +~~~ +# sudo apt install reprepro +~~~ + +## Générer une clef GPG + +Nous souhaitons que nos packages soient automatiquement signés lorsque l'on les ajoute à notre dépôt. Cela permet de vérifier qu'ils proviennent bel et bien de notre archive. Pour ce faire, il va être nécessaire de générer une clef GPG. + +Le user avec lequel nous allons créer la clef sera celui avec lequel vous manipulerez votre dépôt. Avant de créer une clef GPG, vous devriez vous assurer de configurer GPG de manière sécuritaire. Si vous utilisez le `gpg.conf` par défaut, `apt-get` affichera des erreurs quand les gens tenteront de télécharger des packages de votre dépôt. + +Un excellent guide écrit par Daniel Kahn Gillmor - maintainer GPG dans Debian - est ["disponible ici"](https://riseup.net/en/security/message-security/openpgp/best-practices). Si vous ne souhaitez pas lire le guide d'un bout à l'autre, il est possible de ["télécharger ce fichier"](https://raw.githubusercontent.com/ioerror/duraconf/master/configs/gnupg/gpg.conf) et le mettre dans `~/.gnupg/gpg.conf`. Il regroupe l'ensemble des pratiques recommandées par le guide. + +Une fois que vous vous êtes assuré d'avoir une configuration adéquate, il vous faut générer votre clef. Si vous êtes connectés sur un serveur headless, il vous faut rouler les commandes suivantes pour avoir assez d'entropie: + +~~~ +# sudo apt install rng-tools +# sudo rngd -r /dev/urandom +~~~ + +On génère par la suite notre clef. Voici quelques éléments important: + +* Il est important de ne pas ajouter de "Comment" quand GPG nous le demande +* Pour un dépôt, on choisi normalement une clef de type RSA en mode signature seulement +* On choisi une clef la plus longue possible, soit 4096 + +~~~ +# gpg2 --gen-key +~~~ + +Une fois que vous avez créé votre clef, vous pouvez afficher son fingerprint (vous en aurez besoin pour continuer la configuration de `reprepro`) ainsi: + +~~~ +# gpg2 --list-secret-keys + +> Key fingerprint = 677F 54F1 FA86 81AD 8EC0 BCE6 7AEA C4EC 6AAA 0A97 +~~~ + +## Configurations + +Nous allons placer notre dépôt Debian dans `/var/www/repos`. Si vous souhaitez le placer ailleurs, il suffit d'adapter les instruction suivantes en y remplaçant l'emplacement que vous avez choisi. + +~~~ +# sudo mkdir -p /var/www/repos/debian/conf +~~~ + +On crée par la suite `/var/www/repos/debian/conf/distributions`, le fichier qui servira a `reprepro` à identifier les différentes versions de Debian à distribuer. Le fichier devrait parler de lui-même. Pour chaque version de Debian, on ajoute un bloc supplémentaire à la fin du fichier. N'oubliez pas de: + +* remplacer le fingerprint GPG par le vôtre +* spécifier les architectures que vous souhaitez supporter + +~~~ +Origin: Evolix public repository +Label: Evolix public repository +Codename: jessie +Architectures: i386 amd64 armhf +Components: main +Description: Evolix public repository +SignWith: 677F54F1FA8681AD8EC0BCE67AEAC4EC6AAA0A97 + +Origin: Evolix public repository +Label: Evolix public repository +Codename: wheezy +Architectures: i386 amd64 armhf +Components: main +Description: Evolix public repository +SignWith: 677F54F1FA8681AD8EC0BCE67AEAC4EC6AAA0A97 + +Origin: Evolix public repository +Label: Evolix public repository +Codename: squeeze +Architectures: i386 amd64 armhf +Components: main +Description: Evolix public repository +SignWith: 677F54F1FA8681AD8EC0BCE67AEAC4EC6AAA0A97 + +Origin: Evolix public repository +Label: Evolix public repository +Codename: kernel +Architectures: i386 amd64 armhf +Components: main +Description: Evolix public repository +SignWith: 677F54F1FA8681AD8EC0BCE67AEAC4EC6AAA0A97 +~~~ + +Finalement, on créé `/var/www/repos/debian/conf/options`, un fichier d'options pour se simplifier la vie: + +~~~ +verbose +basedir /var/www/repos/debian +ask-passphrase +~~~ + +Pour que les gens puissent profiter de votre dépôt signé, n'oubliez pas d'exporter votre clef GPG publique et de la rendre accessible: + +~~~ +# gpg2 --armor --output /var/www/repos/debian/ma_clef.gpg.asc --export +~~~ + +Et voilà! `reprepro` est prêt à être utilisé! + +## Apache + +Pour que votre dépôt soit disponible en ligne, nous allons ajouter un VHost à un serveur `apache`. Attention! `apache` nécessite souvent une configuration plus étoffée que celle de l'installation par défaut pour être utilisé de manière sécuritaire! Plus d'informations sur `apache` [/wiki/HowtoLAMP/Apache ici]. + +Une fois qu'`apache` est installé, on crée un nouveau VHost dans `/etc/apache2/sites-available/repository.conf`: + +~~~ + + ServerName mondepot.fqdn.org + + ServerAdmin foo@bar.org + DocumentRoot /var/www/repos + + ErrorLog ${APACHE_LOG_DIR}/error.log + + + # We want the user to be able to browse the directory manually + Options Indexes FollowSymLinks Multiviews + Require all granted + + + + Require all denied + + + + Require all denied + + + + Require all denied + + + +~~~ + +Il ne suffit plus qu'à activer le VHost et relancer `apache`: + +~~~ +# sudo a2ensite /etc/apache2/sites-available/repository.conf +# sudo service apache2 reload +~~~ + +Bien évidemment, il vous sera nécessaire de rediriger le DNS du nom de domaine que vous avez choisi vers votre serveur `apache`. + +# Ajouter des packages à son dépôt + +Votre dépôt est maintenant en ligne, mais est toujours vide. Pour y ajouter des packages, lancez la commande suivante: + +~~~ +# reprepro -b /var/www/repos/debian includedeb jessie mon_super_package.deb +~~~ + +`reprepro` vous demande alors le mot de passe de votre clef GPG, signe votre package, crée les dossiers nécessaires et génère tous les fichiers pour vous. + +Vous avez maintenant un dépôt Debian! + +# Télécharger des packages à partir du dépôt + +Pour télécharger des packages de votre archive, il est tout d'abord nécessaire d'installer la clef GPG qui a servi à signer les packages: + +~~~ +# apt-key adv --fetch-key +~~~ + +Une fois que cela est fait, il ne vous reste plus qu'à ajouter votre dépôt dans `/etc/apt/sources.list`: + +~~~ +deb jessie main +~~~ + +# Particularités importantes + +Parce que `reprepro` se veut un utilitaire simple créer des dépôts Debian (comparé à `dak` ou encore `mini-dak`), certaines choses ne sont pas possible: + +* Il n'est pas possible d'avoir plusieurs versions du même package dans une même distribution. La version plus ancienne est automatiquement remplacée par la plus récente. Il est cependant possible d'avoir des versions différentes pour chaque distribution. +* Un package ne peut pas avoir la même version dans plusieurs distributions tout en ayant un SHAsum différent. Dans ce cas, il est nécessaire de changer la version du package pour les distinguer (ex. `1.3.3-1+jessie` sur jessie et `1.3.3-1+wheezy` sur wheezy). Ceci n'est cependant pas un problème si le package est le même (même SHAsum) à travers plusieurs distributions. \ No newline at end of file diff --git a/HowtoDebian/Reseau.md b/HowtoDebian/Reseau.md new file mode 100644 index 00000000..a7e74eb9 --- /dev/null +++ b/HowtoDebian/Reseau.md @@ -0,0 +1,187 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Reseau sous Debian + +## Configuration IP fixe + +La configuration d'une interface réseau avec une IP fixée se passe dans +le fichier _/etc/network/interfaces_. Voici un exemple simple : + +~~~ +auto lo +iface lo inet loopback + +auto eth0 +iface eth0 inet static + address 192.0.43.10 + netmask 255.255.255.0 + gateway 192.0.43.254 +~~~ + +Pour l'IPv6 il faut rajouter : + +~~~ +iface eth0 inet6 static + address 2001:500:88:200::10 + netmask 48 + up /bin/ip route add 2000::0/3 via 2001:500:88:200::254 +~~~ + +Si besoin d'exécuter des commandes après l'activation de l'interface (classiquement +des ajouts de routes), on utilise l'option _up_. Par exemple : + +~~~ +auto eth0 +iface eth0 inet static + address 192.0.43.10 + netmask 255.255.255.0 + gateway 192.0.43.254 + up /sbin/route add -net 192.0.42.0/24 gw 192.0.43.242 +~~~ + +Pour ajouter des interfaces virtuelles, toujours via _/etc/network/interfaces_ on fera : + +~~~ +auto eth0:0 +iface eth0:0 inet static + address 192.0.43.11 + netmask 255.255.255.0 +~~~ + +Note 1 : certains hébergeurs comme OVH préconisent une configuration un peu différente, voir [wiki:ServeurOVH#IPFailOver] + +Note 2 : dans certains cas particuliers (comme le besoin de préciser le nom de l'interface +dans une commande _iptables_) on souhaite avoir un nom d'interface virtuelle sans les ":". +Il faudra donc passer par la commande _ip_ (voir ci-dessous). + +Mais tout cela se gère également dynamiquement via les commande _ifconfig_ et _ip_. +Quelques exemples : + +~~~ +# ifconfig eth0 add 192.0.43.11 netmask 255.255.255.0 +# ip addr add 192.0.43.12/24 dev eth0 +# ip addr add 192.0.43.13/24 dev label eth0:3 +# ip addr del 192.0.43.12/24 +~~~ + +Attention, avec la commande _ip_ le résultat ne sera pas visible avec _ifconfig_ +si aucun label du type eth0:N n'est donné à l'interface ; on ne verra l'adresse qu'avec un : + +~~~ +# ip addr show +~~~ + +Notons que dans certains cas particuliers (comme le besoin de préciser le nom de l'interface +dans une commande _iptables_) on souhaite avoir un nom d'interface virtuelle sans les ":". +On utilisera donc simplement un label sans ":" : + +~~~ +# ip addr add 192.0.43.13/24 dev label eth00 +# iptables -t nat -A POSTROUTING -o eth00 [...] +~~~ + +## Configuration serveur(s) DNS + +Le fichier _/etc/hosts_ permet d'indiquer manuellement des enregistrements DNS, du type : + +~~~ +127.0.0.1 ad.doubleclick.net +~~~ + +Pour note, ces enregistrements sont par défaut prioritaires sur les réponses des serveurs DNS +(et pour rappel, les commandes dig et host n'utilisent PAS _/etc/hosts_). + +La configuration du (ou des) serveur(s) DNS s'effectue dans le fichier _/etc/resolv.conf_. +Voici un exemple classique : + +~~~ +search example.com +nameserver 192.0.42.53 +nameserver 192.0.43.53 +options timeout:2 attempts:2 +~~~ + +Pour des précisions sur les options possibles : _man resolv.conf_ + +Note : si l'on utilise Postfix, il faut le redémarrer suite à un changement dans _/etc/resolv.conf_ (car il est chrooté par dédaut et il gère sa propre copie dans /var/spool/postfix) + +## Bridge + +Pour créer un bridge : + +~~~ +# brctl addbr br0 +# brctl addif br0 eth0 +# ifconfig eth0 up +~~~ + +Au niveau /etc/network/interfaces on aura ainsi : + +~~~ +auto eth0 +iface eth0 inet manual + +auto br0 +iface br0 inet manual + bridge_ports eth0 +~~~ + +Et l'on listera les infos d'un bridge via : + +~~~ +# brctl show +bridge name bridge id STP enabled interfaces +br0 8000.001e0beac6c0 no eth0 +~~~ + +## VLAN + +~~~ +# aptitude install vlan +# modprobe 8021q +~~~ + +Pour ajouter dans le VLAN 42 + +~~~ +# vconfig add eth0 42 +# ifconfig eth0.42 +~~~ + +Le fichier /etc/network/interfaces : + +~~~ +# cat /etc/network/interfaces +auto eth0.42 +iface eth0.42 inet static + address 192.0.43.10 + netmask 255.255.255.0 + gateway 192.0.43.254 +~~~ + +### Gestion des VLAN avec iproute + +L'utilitaire ip (paquet iproute) permet aussi de gérer les VLAN. +Exemple : + + +~~~ +# ip link add link eth0 name eth0.42 type vlan id 42 +# ip addr add 192.168.1.1/24 dev eth0.42 +# ip link set dev eth0.42 up +~~~ + + +## Désactiver IPv6 + +De façon temporaire : + +~~~ +# sysctl -w net.ipv6.conf.all.disable_ipv6=1 +~~~ + +De façon définitive : + +~~~ +# echo net.ipv6.conf.all.disable_ipv6=1 >> /etc/sysctl.conf +~~~ diff --git a/HowtoDebian/Squeeze.md b/HowtoDebian/Squeeze.md new file mode 100644 index 00000000..782d0c8a --- /dev/null +++ b/HowtoDebian/Squeeze.md @@ -0,0 +1,21 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + + + +sources.list : + +~~~ +deb squeeze main +deb squeeze/updates main +deb squeeze-lts main +deb kernel/ +deb squeeze/ +#deb squeeze-backports main +#deb squeeze main +~~~ + ++ + +~~~ +# echo "Acquire::Check-Valid-Until 0;" >> /etc/apt/apt.conf.d/80_oldarchives +~~~ \ No newline at end of file diff --git a/HowtoDebian/liveCD.md b/HowtoDebian/liveCD.md new file mode 100644 index 00000000..113f8cc9 --- /dev/null +++ b/HowtoDebian/liveCD.md @@ -0,0 +1,98 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +Ce Howto permet de créer un liveCD personalisé de Debian. Cela peut être utile dans le cas où vous devez utiliser une version plus récente d'un paquet lors de l'installation (à cause de périphérique non détectés par exemple). + +### Préparation + +Nous allons utiliser l'outil Debian Live Helper pour construire le live CD : +~~~ +aptitude install live-helper +~~~ + +On créé le répertoire dans lequel on va travailler : +~~~ +mkdir ~/livecd +~~~ + +### Personalisation du live CD + +La commande `lh_config` permet de créer le répertoire _config/_ qui contient toute la configuration du live CD : + +## Options utiles + +* `--apt aptitude` : permet d'utiliser aptitude à la place d'apt lors de l'installation ; +* `-a amd64` : permet de définir l'architecture du live CD (par défaut celle de la machine sur laquelle il est créé ; +* `--debian-installer netinst` : permet d'inclure l'installateur netinstall dans le live CD ; +* `--packages "paquets1 paquets2..."` : liste des paquets à installer; +* `--linux-packages ""` : + +~~~ +lh_config +~~~ + +## Ajout de dépôts personnalisés + +Il est possible d'ajouter des dépôts à utiliser dans le répertoire _config/chroot_sources/_ : +~~~ +echo 'deb lenny-backports main contrib non-free' > config/chroot_sources/lenny-backports.chroot +~~~ + +Le _.chroot_ indique que le dépôt sera utilisé uniquement lors de la création du live CD. Pour que le dépôt soit utilisé également lors de l'exécution du live CD (inscrit dans le sources.list du live CD), utilisez l'extension _.binary_. + +## Ajout de paquets personnalisés + +Si les paquets à intégrer au live CD ne sont pas présents dans un dépôt, il suffit de les déposer dans le répertoire _config/chroot_local-packages/_ + +## Définition de la langue et du clavier + +~~~ +lh_config --bootappend-live "locale=en_US.UTF-8 keyb=fr" +~~~ + +## Installation d'un noyau linux depuis testing + +*NOTE :* Il n'est apparemment pas possible d'utiliser le noyau présent dans lenny-backports à cause d'une incompatibilité avec squashfs-tools. On utilise donc le noyau en testing. +~~~ +lh_config -d lenny --linux-packages 'linux-image-2.6 aufs-modules-2.6' --bootloader grub --debian-installer netinst +~~~ + +~~~ +wget ' -P config/chroot_local-packages/ +wget ' -P config/chroot_local-packages/ +~~~ +*FIXME :* + +* trouver comment faire de l'apt-pinning avec live helper : si on ajoute le dépôt testing dans _config/chroot_sources/_, tous les paquets sont pris dans ce dépôt ; +* actuellement, le kernel utilisé par défaut reste celui de lenny, et il faut utiliser grub comme bootloader pour pouvoir choisir manuellement le kernel lenny-backports => trouver l'option / la manip qui permette de définir le kernel par défaut. + +### Création du live CD + +Il suffit simplement d'exécuter `lh_build` : +~~~ +lh_build +~~~ + +*NOTE :* ne pas oublier de faire un `lh_clean` avant de réexécuter `lh_build`, sous peine d'avoir des erreurs du type : +~~~ +mv: ne peut évaluer `chroot/xxx.orig': Aucun fichier ou dossier de ce type +~~~ + +Une image iso du live CD est créée dans binary.iso. + +### Test du live CD + +Test du live CD en utilisant qemu : +~~~ +qemu -cdrom ~/livecd/binary.iso +~~~ + +### Gravure + +Une fois l'image prête, pour la graver : +~~~ +wodim -dev /dev/cdrom binary.iso +~~~ + +### Documentation + +[] diff --git a/HowtoDiscourse.md b/HowtoDiscourse.md new file mode 100644 index 00000000..a6ceb07f --- /dev/null +++ b/HowtoDiscourse.md @@ -0,0 +1,87 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowToDiscourse + +La methode d'installation officielle de Discourse se fait avec docker. Voici les etapes à suivre pour l'installer : + +~~~ +# ln -s /usr/bin/aptitude /usr/bin/apt-get +~~~ +~~~ +# wget -qO- | sh +~~~ +~~~ +# mkdir /var/discourse +~~~ +~~~ +# git clone /var/discourse +~~~ +~~~ +# cd /var/discourse +~~~ +~~~ +# cp samples/standalone.yml containers/app.yml +~~~ +~~~ +# vim containers/app.yml +~~~ + +Partie importante à modifier + +~~~ +... +env: + LANG: en_US.UTF-8 + ## TODO: How many concurrent web requests are supported? + ## With 2GB we recommend 3-4 workers, with 1GB only 2 + UNICORN_WORKERS: 3 + ## + ## TODO: List of comma delimited emails that will be made admin and developer + ## on initial signup example 'user1@example.com,user2@example.com' + DISCOURSE_DEVELOPER_EMAILS: 'exemple@evolix.net' + ## + ## TODO: The domain name this Discourse instance will respond to + DISCOURSE_HOSTNAME: 'exemple.evolix.net' + ## + ## TODO: The mailserver this Discourse instance will use + DISCOURSE_SMTP_ADDRESS: 31.XXX.XX.XX # (mandatory) + DISCOURSE_SMTP_PORT: 25 # (optional) + #DISCOURSE_SMTP_USER_NAME: user@example.com # (optional) + #DISCOURSE_SMTP_PASSWORD: pa$$word # (optional) + DISCOURSE_SMTP_ENABLE_START_TLS: false + ## + ## The CDN address for this Discourse instance (configured to pull) + #DISCOURSE_CDN_URL: //discourse-cdn.example.com +... +~~~ + +Il est important d'indiquer l'IP publique de la machine pour l'envoi de mails, et de rajouter dans la conf postfix le prefix 172.16.0.0/12 dans la directive mynetworks. + +On peut ensuite faire tourner Discourse avec un utilisateur simple + +~~~ +# chown -R foo:foo /var/discourse/ +~~~ +~~~ +# usermod -aG docker foo +~~~ +~~~ +$ ./launcher bootstrap app +~~~ +~~~ +$ ./launcher start app +~~~ + +Modifier la conf postfix en ajoutant 172.16.0.0/12 à la variable mynetworks afin que le conteneur de discourse puisse envoyer des mails + +Maintenance : + +Lors de certaines MAJ via discourse il peut être necessaire une fois la MAJ terminée de reconstruire le conteneur (au cours de cette opération le conteneur sera stoppé et relancé) +~~~ +$ ./launcher rebuild app +~~~ + +En cas d'erreur sur l'application il est possible de rentrer dans le conteneur pour debug +~~~ +$ ./launcher ssh app +~~~ \ No newline at end of file diff --git a/HowtoDjango.md b/HowtoDjango.md new file mode 100644 index 00000000..b04a2668 --- /dev/null +++ b/HowtoDjango.md @@ -0,0 +1,341 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Django + +## Installation + +Pré-requis : on installe Apache-ITK, par exemple en suivant la superbe documentation [wiki:HowtoLAMP/Apache] + +~~~ +# apt install python libapache2-mod-wsgi python-virtualenv python-dev build-essential +~~~ + +On crée un compte (voir [wiki:HowtoLAMP/Apache]) et on configure le Virtualhost associé, +en ajustant les instructions ainsi : + +~~~ +AssignUserID www-jdoe jdoe +WSGIScriptAlias / /home/jdoe/public/mysite/django.wsgi +#Alias /media/ /usr/share/python-support/python-django/django/contrib/admin/media/ +~~~ + +L'idée est d'installer un certain nombre de modules Python de façon globale, et de permettre +à chaque compte d'en ajouter ou d'en avoir de plus récents avec l'outil _virtualenv_ + +~~~ +# apt install python-django python-mysqldb python-imaging python-html5lib libxml2-dev libxslt1-dev virtualenv python-pip +~~~ + +On se connecte ensuite avec le compte concerné, puis on peut installer des modules Python supplémentaires ainsi : + +~~~ +$ virtualenv lib +New python executable in lib/bin/python +Installing setuptools............done. +$ source lib/bin/activate +(lib)$ easy_install pisa relatorio django-extensions +Searching for pisa +Reading +Reading +Reading +Reading +Reading +Reading +Best match: pisa 3.0.33 +Downloading +Processing pisa-3.0.33.zip +Running pisa-3.0.33/setup.py -q bdist_egg --dist-dir /tmp/easy_install-kIDfVZ/pisa-3.0.33/egg-dist-tmp-lUVUuk +zip_safe flag not set; analyzing archive contents... +ho.__init__: module references __path__ +ho.__init__: module references __path__ +sx.__init__: module references __path__ +sx.__init__: module references __path__ +Adding pisa 3.0.33 to easy-install.pth file +Installing pisa script to /home/jdoe/lib/bin +Installing xhtml2pdf script to /home/jdoe/lib/bin + +Installed /home/jdoe/lib/lib/python2.5/site-packages/pisa-3.0.33-py2.5.egg +Processing dependencies for pisa +Finished processing dependencies for pisa +Searching for relatorio +Reading +Reading +Reading +Best match: relatorio 0.5.5 +Downloading +Processing relatorio-0.5.5.tar.gz +Running relatorio-0.5.5/setup.py -q bdist_egg --dist-dir /tmp/easy_install-W_rscM/relatorio-0.5.5/egg-dist-tmp-Hb4E3c +zip_safe flag not set; analyzing archive contents... +relatorio.reporting: module references __file__ +Adding relatorio 0.5.5 to easy-install.pth file + +Installed /home/jdoe/lib/lib/python2.5/site-packages/relatorio-0.5.5-py2.5.egg +Processing dependencies for relatorio +Searching for Genshi>=0.5 +Reading +Reading +Reading +Best match: Genshi 0.6 +Downloading +Processing Genshi-0.6-py2.5.egg +Moving Genshi-0.6-py2.5.egg to /home/jdoe/lib/lib/python2.5/site-packages +Adding Genshi 0.6 to easy-install.pth file + +Installed /home/jdoe/lib/lib/python2.5/site-packages/Genshi-0.6-py2.5.egg +Finished processing dependencies for relatorio +Searching for django-extensions +Reading +Reading +Reading +Best match: django-extensions 0.6 +Downloading +Processing django-extensions-0.6.tar.gz +Running django-extensions-0.6/setup.py -q bdist_egg --dist-dir /tmp/easy_install-j_GIdw/django-extensions-0.6/egg-dist-tmp-5xofTf +zip_safe flag not set; analyzing archive contents... +django_extensions.management.utils: module references __file__ +django_extensions.management.commands.syncdata: module references __file__ +django_extensions.management.commands.show_templatetags: module MAY be using inspect.getabsfile +django_extensions.management.commands.create_app: module references __path__ +django_extensions.management.commands.runprofileserver: module references __path__ +django_extensions.management.commands.create_jobs: module references __file__ +django_extensions.management.commands.create_jobs: module references __path__ +django_extensions.management.commands.runserver_plus: module references __path__ +django_extensions.management.commands.create_command: module references __path__ +Adding django-extensions 0.6 to easy-install.pth file + +Installed /home/jdoe/lib/lib/python2.5/site-packages/django_extensions-0.6-py2.5.egg +Processing dependencies for django-extensions +Finished processing dependencies for django-extensions +~~~ + +On notera l'ajout de _(lib)_ au PS1 pour signaler que l'on utilise virtualenv. +Si l'on veut en sortir : + +~~~ +(lib)$ deactivate +$ +~~~ + +## Focus sur Virtualenv + +_virtualenv_ permet de se créer un environnement en tant qu'utilisateur +avec ses propres versions de bibliothèques, etc. + +Une bonne idée est d'utiliser les bibliothèques du système, et d'en installer +dans _virtualenv_ que si besoin. C'était le comportement par défaut, mais dans +les versions récentes, cela a changé :-( Dans les versions récentes, il faut +donc utiliser l'option _--system-site-packages_ !! + +Fichier de configuration : _~/.virtualenv/virtualenv.ini_ + +~~~ +[virtualenv] +system-site-packages = true +~~~ + +## Focus sur WSGI / modwsgi + + + + + +Pour valider le bon fonctionnement de _modwsgi_, on peut créer un script hello.wsgi suivant : + +~~~ +def application(environ, start_response): + status = '200 OK' + output = 'Hello World!' + + response_headers = [('Content-type', 'text/plain'), + ('Content-Length', str(len(output)))] + start_response(status, response_headers) + + return [output] +~~~ + +Et l'on ajoute l'instruction suivante dans le VirtualHost : + +~~~ +WSGIScriptAlias /hello /var/www/hello.wsgi +~~~ + +Voir + +Configuration avancée de modwsgi : + + + +## Développement Django + +On peut maintenant faire du Django : + +~~~ +$ cd +$ mkdir public +$ cd public +$ django-admin --version +1.1.1 +$ django-admin startproject mysite +$ cd mysite +$ vim django.wsgi +$ vim settings.py +$ vim urls.py +~~~ + +Voici un exemple de fichier _django.wsgi_ qui n'utilise pas Virtualenv : + +~~~ +import os +import sys + +import site + +sys.path.append('/home/jdoe/django/') +os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings' + +import django.core.handlers.wsgi +application = django.core.handlers.wsgi.WSGIHandler() +~~~ + +Pour utiliser Virtualenv, on ajoutera la ligne suivante (après _import site_) : + +~~~ +site.addsitedir('/home/jdoe/lib/lib/python2.6/site-packages') +~~~ + +Vous devez aussi compléter les paramètres de bases de données dans _settings.py_ : + +~~~ +DATABASE_ENGINE = 'mysql' +DATABASE_NAME... +~~~ + +Et initialiser les tables : + +~~~ +$ cd ~/public/mysite +$ python manage.py syncdb +Creating table auth_permission +Creating table auth_group +Creating table auth_user +Creating table auth_message +Creating table django_content_type +Creating table django_session +Creating table django_site + +You just installed Django's auth system, which means you don't have any superusers defined. +Would you like to create one now? (yes/no): yes +Username (Leave blank to use 'jdoe'): +E-mail address: jdoe@example.com +Password: +Password (again): +Superuser created successfully. +Installing index for auth.Permission model +Installing index for auth.Message model +~~~ + +À vous de poursuivre... car cela devient du développement ! + +## Installation des applications admin et admin/doc + +On active dans le fichier _urls.py_ : + +~~~ +from django.contrib import admin +admin.autodiscover() + +urlpatterns = patterns('', + (r'^admin/doc/', include('django.contrib.admindocs.urls')), + (r'^admin/', include(admin.site.urls)), +) +~~~ + +Et dans _settings.py_ on ajoute : + +~~~ +INSTALLED_APPS = ( + [...] + 'django.contrib.admin', + 'django.contrib.admindocs', +) +~~~ + +Et on met à jour la base de données : + +~~~ +$ cd ~/public/mysite +$ python manage.py syncdb +Creating table django_admin_log +Installing index for admin.LogEntry model +~~~ + +Et voilà, vous devriez pouvoir accéder +aux apps admin et admin/doc via les URL + et + + + +## Mise-à-jour de Django + +Le backport de Django sous Debian Lenny est en version 1.1.1 Pour diverses raisons, vous pouvez vouloir avoir une version plus récente de Django. +Dans ce cas, il faut le gérer au niveau du compte avec _virtualenv_ : + +~~~ +$ cd ~/lib +$ source bin/activate +(lib)$ easy_install Django +Searching for Django +Reading +Reading +Best match: Django 1.2.4 +Downloading +Processing Django-1.2.4.tar.gz +Running Django-1.2.4/setup.py -q bdist_egg --dist-dir /tmp/easy_install-c7zimn/Django-1.2.4/egg-dist-tmp-W72Kh6 +zip_safe flag not set; analyzing archive contents... +django.test._doctest: module references __file__ +django.test._doctest: module MAY be using inspect.getsourcefile +django.test.simple: module references __file__ +django.db.utils: module references __file__ +django.db.models.loading: module references __file__ +django.core.management.__init__: module references __file__ +django.core.management.__init__: module references __path__ +django.core.management.base: module references __path__ +django.core.management.sql: module references __file__ +django.core.management.commands.makemessages: module references __file__ +django.core.management.commands.loaddata: module references __file__ +django.core.management.commands.loaddata: module references __path__ +django.core.servers.base module references __path__ +django.contrib.flatpages.tests.views: module references __file__ +django.contrib.flatpages.tests.middleware: module references __file__ +django.contrib.flatpages.tests.csrf: module references __file__ +django.contrib.admindocs.views: module references __file__ +django.contrib.gis.tests.geogapp.tests: module references __file__ +django.contrib.gis.tests.layermap.tests: module references __file__ +django.contrib.gis.tests.geo3d.tests: module references __file__ +django.contrib.gis.geometry.test_data: module references __file__ +django.contrib.auth.tests.views: module references __file__ +django.views.i18n: module references __file__ +django.conf.__init__: module references __file__ +django.conf.project_template.manage: module references __file__ +django.utils.autoreload: module references __file__ +django.utils.module_loading: module references __path__ +django.utils.version: module references __path__ +django.utils.translation.trans_real: module references __file__ +django.template.loaders.app_directories: module references __file__ +Adding Django 1.2.4 to easy-install.pth file +Installing django-admin.py script to /home/jdoe/lib/bin + +Installed /home/jdoe/lib/lib/python2.5/site-packages/Django-1.2.4-py2.5.egg +Processing dependencies for Django +Finished processing dependencies for Django +~~~ + +Notez que dans ce cas là, vous devrez gérer vous même les futurs problèmes de sécurité ! +Si vous pouvez vous le permettre, vous pourrez mettre ainsi mettre à jour Django via : + +~~~ +$ cd ~/lib +$ source bin/activate +(lib)$ easy_install -U Django +~~~ + diff --git a/HowtoDovecot.md b/HowtoDovecot.md new file mode 100644 index 00000000..46fa85cd --- /dev/null +++ b/HowtoDovecot.md @@ -0,0 +1,338 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Dovecot + +## Installation + +Dovecot est un puissant serveur POP et IMAP. +Pour l'installer sous Debian : + +~~~ +# aptitude install dovecot-pop3d dovecot-imapd +~~~ + +## Configuration + +La configuration de Dovecot se trouve dans le répertoire _/etc/dovecot_ +et notamment le fichier _dovecot.conf_. + +Pour activer les protocoles POP(S) et IMAP(S) : + +~~~ +protocols = imap imaps pop3 pop3s +~~~ + +Pour autoriser l'authentification en clair même sans SSL/TLS (attention, +les identifiants circuleront donc en clair !!) : + +~~~ +disable_plaintext_auth = no +~~~ + +### Support du + dans les adresses + +Il faut patcher le master.cf de postfix ainsi : + + +~~~ +- flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient} ++ flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -a ${recipient} -d ${user}@${nexthop} +~~~ + + +### Crée des boîtes IMAP automatiquement + +Voir + +~~~ +namespace inbox { + location = + mailbox Drafts { + auto = no + special_use = \\Drafts + } + mailbox Sent { + auto = subscribe + special_use = \\Sent + } + mailbox Spam { + auto = subscribe + special_use = \\Junk + } + mailbox Trash { + auto = no + special_use = \\Trash + } + prefix = +} + +~~~ + +### SSL/TLS + +~~~ +ssl_cert = + +On peut aussi utiliser des outils pour générer les règles comme Roundcube, Horde/Ingo, etc. voir + +### Déduplication des mails entrants + +Pour réaliser un équivalent de la règle procmail suivante : +~~~ +:0 Wh: msgid.lock +| formail -D 8192 $HOME/.msgid.lock +~~~ + +Testé avec Dovecot > 2.1 + +Ajouter le plugin sieve duplicate dans /etc/dovecot/conf.d/90-sieve.conf : +~~~ + sieve_extensions = +vnd.dovecot.duplicate +~~~ + +Puis dans les règles sieve : + +~~~ +require ["fileinto","vnd.dovecot.duplicate"]; +if duplicate { + fileinto "Trash"; +} +# Si on est sûr de vouloir les supprimer +#if duplicate { +# discard; +#} +~~~ + +Note : la ligne require doit être unique et en début de fichier, si des modules sont déjà chargés il suffit d'ajouter "vnd.dovecot.duplicate". + +## Mode debug + +### Activer le raw logging + + + +Par exemple en IMAP, il faut activer cela dans le _dovecot.conf_ : + +~~~ +protocol imap { + mail_executable = /usr/lib/dovecot/rawlog /usr/lib/dovecot/imap +} +~~~ + +Ensuite, il suffit de créer un répertoire _dovecot.rawlog_ dans le $HOME +de l'utilisateur (accessible en écriture évidemment), et toutes les commandes +IMAP passées seront stockées dans des fichiers : -.*.{in,out} + +### Debug pour l'authentification + +Activer : + +~~~ +# queries. +auth_debug = yes +#auth_debug_passwords = yes +~~~ + +## Nombre max de processus de login + +À chaque login, dovecot fork un processus. Afin d'éviter les fork-bomb s'il y a trop de connexions il y a une limite par défaut à 128. L'augmenter peut résoudre des problèmes si le serveur reçoit de nombreuses connexions. + +~~~ +login_max_processes_count = 256 +~~~ + +Il faut en parallèle augmenter la limite sur le nombre de fichiers ouverts, dans _/etc/default/dovecot_ : +~~~ +ulimit -n 5696 +~~~ + +## Nombre max de connexion par IP+Login + +Dovecot limite également le nombre de connexion IMAP d'une même IP avec un même compte. +Cette limite est de 10 par défaut, il est possible de l'augmenter en ajoutant dans la section IMAP : + +~~~ +mail_max_userip_connections = 42 +~~~ + +Si la limite n'est pas assez haute, on aura cette erreur : + +~~~ +dovecot: imap-login: Maximum number of connections from user+IP exceeded (mail_max_userip_connections) +~~~ + + +## Mountpoints + + + + +## Erreurs de LOCK + +Si vous avez des chargements très longs à l'authentification ou des erreurs de type : + +~~~ +-ERR [IN-USE] Couldn't open INBOX: Timeout while waiting for lock +~~~ + +c'est peut-être que les locks sont activés pour le protocole POP3. Ainsi, dès qu'une connexion POP3 est en cours, +elle bloques les autres connexions POP3... et même IMAP. Pour résoudre cela, s'assurer d'avoir activé : + +~~~ +pop3_lock_session=no +~~~ + +## Munin + +Plusieurs plugins Munin sont disponibles sur + +Nous utilisons principalement +à télécharger dans /etc/munin/plugins/ avec les droits 755 que l'on fait tourner avec le groupe adm via +/etc/munin/plugin-conf.d/munin-node : + +~~~ +[dovecot] +group adm +~~~ + +## doveadm + +La commande _doveadm_ permet d'avoir différentes interactions avec le serveur Dovecot. Par exemple : + +~~~ +# doveadm who +username # proto (pids) (ips) +jdoe@example.com 1 imap (4242) () + +# doveadm kick foo 192.0.2.0/24 +kicked connections from the following users: +foo +~~~ + +## FAQ + +### Erreur "Out of memory" + +Si vous avez des erreurs du type : + +~~~ +dovecot: imap(foo): Fatal: block_alloc(16777216): Out of memory +dovecot: imap(foo): Fatal: master: service(imap): child 666 returned error 83 (Out of memory (service imap { vsz_limit=256 MB }, you may need to increase it)) +~~~ + +Vous pouvez augmenter la mémoire _vsz_limit = 512M_ dans le service imap. + diff --git a/HowtoEXT3.md b/HowtoEXT3.md new file mode 100644 index 00000000..23d165d4 --- /dev/null +++ b/HowtoEXT3.md @@ -0,0 +1,5 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto EXT3 + +=> obsolète : voir [wiki:HowtoFileSystem] \ No newline at end of file diff --git a/HowtoEchoping.md b/HowtoEchoping.md new file mode 100644 index 00000000..914c5d19 --- /dev/null +++ b/HowtoEchoping.md @@ -0,0 +1,10 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto echoping + +Exemples : + +~~~ +$ echoping -h / -n 5 -t 10 -R www.evolix.fr +$ echoping -t 5 -4 -m dns -n 20 ns4.evolix.net -t A gzip.be +~~~ \ No newline at end of file diff --git a/HowtoEjabberd.md b/HowtoEjabberd.md new file mode 100644 index 00000000..850c65e8 --- /dev/null +++ b/HowtoEjabberd.md @@ -0,0 +1,139 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Ejabberd + +Ejabberd est un serveur Jabber écrit en Erlang. + + + +## Installation + +Ejabberd est packagé dans Debian : + +~~~ +# apt install ejabberd +~~~ + +Lors de l'installation, indiquer : + +* hostname : le domaine principal (fqdn) que le serveur devra gérer ; +* compte admin : un compte Jabber (sans la partie @domaine) qui sera admin du serveur (permet l'accès à l'interface web + accès à diverses commandes admin depuis un client Jabber. + +## DNS + +Enregistrements à rajouter dans la zone DNS : + +~~~ +_xmpp-client._tcp IN SRV 0 0 5222 im +_xmpp-server._tcp IN SRV 0 0 5269 im +im IN A 192.0.2.42 +~~~ + +Note : __xmpp-server_ est facultatif, mais recommandé pour communiquer avec d'autres serveurs XMPP. + +## Configuration + +La configuration se fait désormais via le fichier _/etc/ejabberd/ejabberd.yml_. + +Pour configurer plusieurs hosts : + +~~~ +hosts: + - "im.example.com" + - "example.com" +~~~ + +### Authentification (à mettre à jour) + +Ejabberd supporte plusieurs backends externes pour l'authentification (MySQL, LDAP, PAM, script externe…). + +Pour utiliser un annuaire LDAP : + +* commenter `{auth_method, internal}.` pour ne faire _que_ de l'authentification sur LDAP. Pour utiliser plusieurs méthodes d'authentification, il est possible de passer une liste comme ceci : +~~~ +{auth_method, [ldap, internal]}. +~~~ + +* Décommenter/modifier les directives suivantes : +~~~ +%% +%% Authentication using LDAP +%% +{auth_method, ldap}. + +%% List of LDAP servers: +{ldap_servers, ["localhost"]}. + +%% Encryption of connection to LDAP servers (LDAPS): +{ldap_encrypt, none}. +%%{ldap_encrypt, tls}. + +%% Port connect to LDAP server: +{ldap_port, 389}. +%%{ldap_port, 636}. + +%% LDAP manager: +%%{ldap_rootdn, "dc=example,dc=com"}. + +%% Password to LDAP manager: +%%{ldap_password, "******"}. + +%% Search base of LDAP directory: +{ldap_base, "dc=example,dc=com"}. + +%% LDAP attribute that holds user ID: +{ldap_uids, [{"uid", "%u"}]}. + +%% LDAP filter: +{ldap_filter, "(objectClass=shadowAccount)"}. +~~~ + +### Optimisation + +Par défaut, le support du multi-cœur n'est pas forcément désactivé. Pour l'activer si le processeur le supporte, éditer le fichier _/etc/default/ejabberd_ : +~~~ +SMP=auto +~~~ + +## Administration + +~~~ +# ejabberdctl status +The node ejabberd@node is started with status: started +ejabberd 14.07 is running in that node + +# ejabberdctl register jdoe im.example.com + +# ejabberdctl connected_users +jdoe@im.example.com/4767678256447397329306554 + +# ejabberdctl registered_users im.example.com +jdoe + +# ejabberdctl kick jdoe im.example.com +# ejabberdctl unregister jdoe im.example.com + +~~~ + +## Sauvegarde / migration + +~~~ +# ejabberdctl dump /tmp/ejabber.dump && mv /tmp/ejabber.dump /home/backup/ +~~~ + +La restauration se fait avec `ejabberdctl load` + +Note : on peut s'en servir pour migrer des données, en reformatant le fichier de dump qui n'est complexe à comprendre. +Par exemple pour migrer le répertoire des utilisateurs (roster) : + +~~~ +{tables,[{roster,[{record_name,roster}, + {attributes,[usj,us,jid,name,subscription,ask,groups, + askmessage,xs]}]}]}. +{roster,{"jdoe","im.example.com", + {"bob","gmail.com",[]}}, + {"jdoe","im.example.com"}, + {"bob","gmail.com",[]}, + [],both,none,[],<<>>,[]}. +[...] +~~~ \ No newline at end of file diff --git a/HowtoEtherpad.md b/HowtoEtherpad.md new file mode 100644 index 00000000..5ee3438b --- /dev/null +++ b/HowtoEtherpad.md @@ -0,0 +1,141 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowtoEtherpad + +Etherpad est un éditeur texte collaboratif en ligne. +On utilise désormais la version Etherpad-Lite. + +* +* +* Statut du package Debian officiel : + +## Installation + +Debian Jessie : + +~~~ +# apt install gzip git curl python libssl-dev pkg-config build-essential +# apt install nodejs npm +# adduser --system --home=/home/etherpad-lite --group etherpad-lite +$ git clone git://github.com/ether/etherpad-lite.git +# vim /etc/systemd/system/etherpad-lite.service + +[Unit] +Description=etherpad-lite (real-time collaborative document editing) +After=syslog.target network.target + +[Service] +Type=simple +User=etherpad-lite +Group=etherpad-lite +ExecStart=/home/etherpad-lite/etherpad-lite/bin/run.sh + +[Install] +WantedBy=multi-user.target + +# systemctl enable etherpad-lite +Created symlink from /etc/systemd/system/multi-user.target.wants/etherpad-lite.service to /etc/systemd/system/etherpad-lite.service. +# systemctl start etherpad-lite +~~~ + +Voir + +Note : les scripts bin/run.sh et bin/installDeps.sh utilisent la commande "node" et non "nodejs", il peut donc être nécessaire de modifier ou créer un alias node=nodejs + +### Installation (deprecated) + +En installant nodejs depuis les sources. +Suivre les infos sur : + +~~~ +# aptitude install gzip git-core curl python libssl-dev build-essential +# apt-get build-dep nodejs=0.6.8~dfsg1-1 +$ wget +$ tar xvf node-v0.6.10.tar.gz +$ cd node-v0.6.10 +$ ./configure && make +# make install +$ git clone +$ cd ../etherpad-lite/ +$ ./bin/installDeps.sh +$ vim settings.json +$ ./bin/run.sh +~~~ + +Lancer bin/run.sh + +## Configuration + +Cela ce passe dans _settings.json_ + +### Stockage des données + +Par défaut, Etherpad utilise DirtyDB (un fichier à plat) mais on peut utiliser sqlite ou MySQL. + +Pour DirtyDB : + +~~~ + "dbType" : "dirty", + "dbSettings" : { + "filename" : "var/dirty.db" + }, +~~~ + +Pour MySQL utiliser MySQL : + +~~~ +mysql> create database etherpad; +mysql> grant CREATE,ALTER,SELECT,INSERT,UPDATE,DELETE on `etherpad`.* to 'etherpad'@'localhost' identified by ''; +~~~ + +puis : + +~~~ + "dbType" : "mysql", + "dbSettings" : { + "user" : "etherpad", + "host" : "127.0.0.1", + "password": "", + "database": "etherpad" + }, +~~~ + +puis : + +~~~ +$ sh bin/installDeps.sh +# systemctl restart etherpad-lite +mysql> show tables ++--------------------+ +| Tables_in_etherpad | ++--------------------+ +| store | ++--------------------+ +mysql> ALTER DATABASE `etherpad` CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; +mysql> ALTER TABLE `store` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; +~~~ + +Voir + +### Reverse Proxy + +Avec Nginx : + +~~~ +server { + listen 80; + server_name pad.example.com; + + location / { + proxy_pass + proxy_set_header Host $host; + proxy_pass_header Server; + proxy_buffering off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $host; + proxy_ 1.1; + } +} +~~~ + +Voir diff --git a/HowtoEthtool.md b/HowtoEthtool.md new file mode 100644 index 00000000..8bb16840 --- /dev/null +++ b/HowtoEthtool.md @@ -0,0 +1,51 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto ethtool + +## ethtool + +Installer ethtool : + +~~~ +# aptitude install ethtool +~~~ + +Consulter l'état d'une interface : + +~~~ +# ethtool eth0 +Settings for eth0: + Supported ports: [ TP ] + Supported link modes: 10baseT/Half 10baseT/Full + 100baseT/Half 100baseT/Full + 1000baseT/Full + Supports auto-negotiation: Yes + Advertised link modes: Not reported + Advertised pause frame use: No + Advertised auto-negotiation: No + Speed: 10Mb/s + Duplex: Half + Port: Twisted Pair + PHYAD: 1 + Transceiver: internal + Auto-negotiation: off + MDI-X: Unknown + Supports Wake-on: g + Wake-on: d + Link detected: yes +~~~ + +Changer son état (par exemple) : + +~~~ +# ethtool -s eth0 speed 10 duplex full autoneg off +~~~ + +## Changer son adresse MAC + +Cela n'a pas un lien direct avec _ethtool_ mais pour changer son adresse MAC sur une machine Linux, on fera : + +~~~ +# ifconfig eth0 hw ether 01:23:45:67:89:0a +~~~ + diff --git a/HowtoFAI.md b/HowtoFAI.md new file mode 100644 index 00000000..8dd18700 --- /dev/null +++ b/HowtoFAI.md @@ -0,0 +1,483 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# How to FAI + +Cette page décrit une des utilisations possible de FAI, Fully Automated Install, un système d'installation de Linux non-interactif. + +L'utilité de FAI est qu'il permet d'installer en quelques minutes un système Debian complet sans aucune interaction humaine. Evolix n'utilise pas l'ensemble des fonctionnalités de FAI. + +La documentation de FAI est très complète et peut être consultée ["ici (anglais)"](http://fai-project.org/fai-guide/index.html). + +## FAI server vs FAI "serverless" + +Il existe deux moyens principaux d'installer des machines à l'aide de FAI. Le premier implique l'utilisation d'un serveur FAI qui va fournir les services suivants: + +* DHCP (pour configurer le réseau) +* TFTP (sert l'initrd et le kernel lors de l'installation) +* NFS (sert l'ensemble des autre fichiers nécessaires) + +Ce serveur contient l'ensemble de la configuration des clients. + +La seconde manière d'installer une machine avec FAI est de monter une image complète de l'installation et de l'utiliser comme on le ferait avec une image ISO standard. + +L'avantage de cette méthode est que le client n'a pas besoin d'avoir accès à internet (au serveur FAI) pour effectuer l'installation. Il est ainsi possible de mettre l'image sur une clef USB ou un CD. + +Pour créer cette image disque, il est cependant nécessaire d'avoir une machine qui roule les programmes fournis par le package Debian `fai-server`. Nous appellerons cette méthode du nom de l'utilitaire qui sert à générer les images: fai-cd. + +# fai-server + +La première étape pour monter le serveur FAI est d'installer les packages nécessaires à son bon fonctionnement. Pour simplifier la tâche, Debian fournit un package virtuel qui installe l'ensemble des choses requises: + +~~~ +# apt install fai-quickstart +~~~ + +Lors de l'installation, plusieurs fichiers de configuration sont créés. Ceux qui nous intéressent pour l'instant se trouvent dans `/etc/fai`. + +Par exemple, lors des installations FAI utilise d'autres sources que celles configurées dans `/etc/apt`. Par défaut FAI utilise [](http:// + +Si vous disposez d'un miroir local et que ce miroir est disponible pour les machines que vous comptez installer avec FAI, il est intéressant de changer ce paramètre. Les fichiers à modifier sont `/etc/fai/apt/sources.list` et `/etc/fai/nfsroot.conf`. Par exemple, chez Évolix nous avons: + +~~~ +# cat /etc/fai/nfsroot.conf + +# For a detailed description see nfsroot.conf(5) + +# " " for debootstrap +FAI_DEBOOTSTRAP="jessie +FAI_ROOTPW='XXXXXXXXX' + +NFSROOT=/srv/fai/nfsroot +TFTPROOT=/srv/tftp/fai +NFSROOT_HOOKS=/etc/fai/nfsroot-hooks/ +FAI_DEBOOTSTRAP_OPTS="--exclude=info --include=aptitude" + +# Configuration space +FAI_CONFIGDIR=/srv/fai/config +~~~ + +et + +~~~ +# cat /etc/fai/apt/sources.list + +deb jessie main contrib non-free +deb jessie/updates main contrib non-free +~~~ + +Il est cependant bon de noter que si `debootstrap` n'arrive pas à se connecter au miroir correctement, le processus de création du NFSROOT continue comme si de rien n'était. Il est ainsi peut être plus prudent d'utiliser un miroir officiel pour cette partie. + +Pour pouvoir continuer, on active l'utilisateur principal qui va être utilisé par FAI et on spécifie la configuration à utiliser pour une installation via NFS: + +~~~ +# vim /etc/fai/fai.conf + +# See fai.conf(5) for detailed information. + +# Account for saving log files and calling fai-chboot. +LOGUSER=fai + +# URL to access the fai config space +FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config +~~~ + +Une fois que les packages sont installés et que l'on a modifié la configuration initiale comme on le souhaitait, on roule la commande suivante pour terminer l'installation. Attention! il est nécessaire d'avoir `aptitude` pour que `fai-setup` et les commandes qui suivent fonctionnent comme il se doit: + +~~~ +$ fai-setup -v +~~~ + +Cette commande fait plusieurs choses: +1. Elle crée un nouvel utilisateur, `fai` +1. Elle génère une paire de clefs ssh pour cet utilisateur dans `/var/log/fai/.ssh` +1. Elle crée le NFSROOT dans `/srv/fai/nfsroot` et le peuple avec un debootstrap en vue des installations. + +Si vous souhaitez utiliser FAI sans serveur PXE (méthode fai-cd), vous pouvez passez à la [#Configuration "section Configurations] tout de suite. Pour avoir un fai-server complet, il faut continuer et configurer le DHCP, le PXE et le NFS. + +## DHCP + +Par défaut l'installation du package `fai-quickstart` a déjà installé les packages nécessaires pour monter un serveur DHCP. Il ne nous reste qu'à le configurer. On remplace donc `/etc/dhcp/dhcpd.conf` par la configuration suivante: + +~~~ +deny unknown-clients; +option dhcp-max-message-size 2048; +use-host-decl-names on; + +subnet netmask { + option routers ; + option domain-name ""; + option domain-name-servers ; + server-name faiserver + next-server faiserver; + filename "fai/pxelinux.0"; + +# host { # the hostname associated to FAI classes +# hardware ethernet ; +# fixed-address ; # optional. Should be set in /etc/hosts +# } +} +~~~ + +Cette configuration attribue une adresse IP fixe à une machine seulement si son adresse MAC y a été configuré. Vous pouvez ajouter des nouvelles machines manuellement en copiant le bloc commenté, mais une solution plus simple existe également. En effet, FAI utilise un programme nommé `dhcp-edit` qui fait tout le travail pour nous. + +Il faut tout d'abord ajouter la nouvelle machine au `/etc/hosts`: + +~~~ +# echo ' evodemo' >> /etc/hosts +~~~ + +On ajoute ensuite la machine au DHCP: + +~~~ +# dhcp-edit evodemo +~~~ + +Et voilà! `dhcp-edit` redémarre même le DHCP pour nous. + +## NFS + +En théorie, votre serveur NFS fonctionne déjà et ne nécessite aucune modification pour fonctionner. Il existe cependant un bug dans le fichier d'init de `nfs-kernel-server` sur Jessie qui l'empêche de fonctionner comme il se doit. On modifie donc `/etc/init.d/nfs-kernel-server` pour ajouter un commande `sleep` au démarrage: + +~~~ +[...] +# See how we were called. +case "$1" in + start) + sleep 10 + export_files="/etc/exports" +[...] +~~~ + +Vous devriez maintenant pouvoir lancer `nfs-kernel-server` avec succès: + +~~~ +# service nfs-kernel-server restart +# systemctl daemon-reload +~~~ + +Il faut de plus vous assurer que votre firewall ne bloque pas les ports nécessaires au NFS: + +* TCP 111 +* TCP 2049 +* UDP 111 +* UDP 2049 + +Si vous avez des problèmes avec votre NFSROOT lors de l'installation, le plus simple est de supprimer le dossier `/srv/fai/nfsroot` et de relancer `fai-setup -v`. + +## PXE + +Il ne nous reste plus qu'à générer les fichiers de configuration PXE pour la nouvelle machine que l'on souhaite installer. Encore une fois, FAI dispose d'un utilitaire pour nous simplifier la vie: + +~~~ +# fai-chboot -IFv -u nfs://faiserver/srv/fai/config evodemo +~~~ + +On s'assurer finalement que tous les fichiers de PXE on les bonnes permissions: + +~~~ +# chmod -R u+rwX,go+rX,go-w /srv/tftp +~~~ + +# Configuration + +Avant de commencer à décrire le "language FAI", il est bon de savoir que le package Debian viens avec des exemples concrêts et fonctionnels de configuration. On peut les utiliser comme base de départ: + +~~~ +# mkdir /srv/fai/config +# cp -a /usr/share/doc/fai-doc/examples/simple/* /srv/fai/config +~~~ + +FAI utilise une méthode basée sur des classes pour savoir quelles configurations utiliser lors d'une installation. Par exemple, la configuration pour une machine Debian de base roulant XFCE fournie avec le package `fai-quickstart` utilise les classes suivantes: + +`FAIBASE GRUB DHCPC DEMO XORG XFCE` + +Ces classes sont entièrement configurables. Elles sont liées au hostname (nom de domaine) de la machine qui va être installée. Avant l'installation, il est donc nécessaire soit: + +* de modifier la configuration pour spécifier les classes à utiliser pour le hostname +* de choisir le hostname en fonction de l'installation que l'on souhaite effectuer + +Ainsi, pour une machine roulant XFCE, on utiliserait le hostname `xfcehost` lors de l'installation. + +Dans la partie qui suit, nous allons passer en revue les différents dossiers de configuration et leurs fonction dans la configuration d'une machine: + +## class + +Tous les noms des classes sont en majuscules, à l'exception des classes définies pour un hostname seulement. Le nom des classes ne peuvent pas contenir les caractères suivants: + +* trait d'union (`-`) +* dièse (`#`) +* point-virgule (`;`) +* point (`.`) + +Les barres de soulignement (`_`) et les numéros sont cependant acceptés. + +Les fichiers dans le dossier `class` sont utilisés pour lier des hostnames à des classes. Le nom des fichiers dans ce dossier suit la convention suivante: `^[0-9][0-9]*`. + +Ainsi, le fichier `10-important-class` est lu avant le fichier `99-less-than-important`. Des fichiers nommés `mysuperclass` ou `1-thiswillnotrun` ne seraient tout simplement pas lu. + +Il est également possible d'avoir un fichier de définition de classe pour une seule machine. En quel cas, on utilise le hostname comme nom du fichier de définition (i.e. `kvm4`). + +L'ordre des classes est important car il est parfois nécessaire d'effectuer certaines étapes de configuration avant d'autres. + +Voici un exemple de définition de classe: + +~~~ +#! /bin/bash + +# assign classes for kvm machines + +case $HOSTNAME in + kvm?.evolix.net|othermachine*) + echo "FAIBASE KVM" ;; +esac + +case $HOSTNAME in + othermachine*) + echo ""MYSUPERCLASS ;; # a comment here +esac +~~~ + +En plus des classes définies dans le dossier `class`, les classes DEFAULT et LAST s'appliquent à l'ensemble des machines. + +Pour chaque classe ou hostname, il est possible de créer un fichier `*.var` (i.e. `DEBIAN.var`) qui regroupe des variables à utiliser dans les scripts: + +~~~ +# cat class/DEBIAN.var +PARTY_HARD=1 +MYSUPERVAR="foobar" +~~~ + +Plus de détails sur la ["page du projet FAI"](http://fai-project.org/fai-guide/#_a_id_classvariables_a_defining_variables). + +## files + +Le dossier `files` est peut-être le plus simple des dossiers de configuration. Il contient l'ensemble des fichiers que l'on souhaite transférer lors d'une installation. Ainsi, un `tree` du dossier `files` pourrait ressembler à: + +~~~ +files/ +|-- etc +| |-- apt +| | |-- apt.conf.d +| | | `-- force_confdef +| | | |-- DEBIAN +| | | `-- kvm4 +| | `-- sources.list +| | `-- GNOME +| |-- dhcp +| | `-- dhcpd.conf +| | `-- FAISERVER +| |-- fai +| | |-- apt +| | | `-- sources.list +| | | `-- FAISERVER +| | |-- fai.conf +| | | `-- FAISERVER +| | `-- nfsroot.conf +| | `-- FAISERVER +| |-- motd +| | `-- FAIBASE +| |-- rc.local +| | `-- FAISERVER +| `-- selinux +| `-- config +| `-- CENTOS +`-- usr + `-- local + `-- sbin + `-- make_a_party + `-- DEFAULT +~~~ + +La seule différence avec un dossier régulier est que plutôt que de créer un fichier directement, on crée un dossier du nom de ce fichier et l'on spécifie la version à utiliser en fonction d'une classe ou d'un hostname. Par exemple: + +~~~ +# ls files/etc/postfix/main.cf/ +DEFAULT MYCLASS1 kvm4 +~~~ + +Ici, les trois fichiers dans le dossier `files/etc/postfix/main.cf/` sont en fait des versions différentes du fichier de configuration `main.cf`. Le fichier `DEFAULT` va être installé par la classe `DEFAULT`, le fichier `MYCLASS1` va être installé par la classe `MYCLASS1` et le fichier `kvm4` va être installé seulement si le hostname de la machine est `kvm4`. + +## scripts + +Le dossier `scripts` rassemble les scripts qui vont faire des actions sur les machines. Par exemple le script suivant copie un fichier de configuration à partir des fichiers dans le dossier `files` avec les droits (root,root,0644): + +~~~ +#!/bin/bash + +fcopy -M etc/postfix/main.cf +~~~ + +Les scripts sont regroupés par classe. Ainsi, tous les scripts dans `scripts/POSTFIX` vont être exécutés pour la classe POSTFIX. Le nom des scripts suit la même convention que le nom des fichiers dans [#class `class`]. + +Il est possible d'écrire des scripts dans de multiples langages, dont shell, cfengine, Perl, Python, Ruby, expect, etc. + +FAI installe certaines commandes qui peuvent être très utiles: + +* [`fcopy`](http://fai-project.org/doc/man/fcopy.html) pour copier des fichiers sur la machine +* [`ftar`](http://fai-project.org/doc/man/ftar.html) pour copier et extraire une archive tar +* ["`ainsl` (append if no such line)"](http://fai-project.org/doc/man/ainsl.html) pour ajouter une ligne dans un fichier + +Il est également possible de tester si une classe est définie en shell script grâce à la commande `ifclass`: + +~~~ +ifclass -o A B C # retourne 0 si A, B ou C est défini +ifclass -a A B C # retourne 0 si A, B et C est défini +~~~ + +## package_config + +Le dossier `package_config` regroupe les définitions de packages à installer pour chaque classe. Une classe installe les packages dans un fichier si ce dernier a le nom de la classe en question. Ainsi, la classe DEBIAN installe les packages dans `package_config/DEBIAN`. + +Voici un exemple d'un fichier dans `packages_config`: + +~~~ +PACKAGES taskinst +german + +PACKAGES aptitude +adduser netstd ae +less passwd + +PACKAGES remove +gpm xdm +~~~ + +Une ligne commence toujours par `PACKAGES`. Elle est par la suite suivie de la commande à exécuter. Sur la ligne suivante, on liste les packages sur lesquels effectuer l'action. Voici les actions qui sont valides: + +* hold +* install +* remove +* taskinst +* aptitude +* aptitude-r +* unpack + +Le détail de ces actions est disponible avec la commande [install_packages -H](http://fai-project.org/doc/man/install_packages.html). + +Avant d'installer les packages pour une classe ou un hostname, FAI ajoute le contenu de tous les fichiers nommées $CLASS.asc à la liste des clefs autorisées de `apt`. Cela est très pratique pour un miroir local contenant des packages non officiels. + +## disk_config + +FAI gère la partition des disques lors de l'installation grâce aux fichiers dans le dossier `disk_config`. Ces fichiers doivent être nommés selon le nom d'une classe. Bien évidemment, il n'est pas recommandé d'avoir plusieurs fichiers disk_config pour un même ensemble de classes! + +La syntaxe utilisée pour les fichiers peut être retrouvée dans la page de manuel de l'outil utilisé pour la partition [setup-storage](http://fai-project.org/doc/man/setup-storage.html). + +Voici un exemple de configuration utilisant la partition typique d'Évolix sur ses machines: + +~~~ +disk_config sda disklabel:msdos bootable:1 + +primary /boot 200 ext4 rw +primary / 500 ext4 rw +primary /var 10G ext4 rw +logical /tmp 500 ext4 rw,nosuid +logical /usr 5G ext4 rw +logical swap 500 swap sw +logical swap 500 swap sw +logical /home 15G ext4 rw +~~~ + +## debconf + +Si l'on souhaite effectuer un preseed du package `debconf`, il est possible de créer un dossier nommé `debconf` et d'y ajouter des fichiers du nom d'une classe. + +## hooks + +Pour bien comprendre les `hooks` de FAI, il faut expliquer les `tasks`. Quand une installation est lancée (que ce soit par NFSROOT ou par fai-cd), FAI lance une série d'action que l'on nomme des tasks. Ainsi, pendant le processus d'installation, FAI va éventuellement lancer le task `partition`, qui partitionne les disques. + +Voici tous les `tasks` que FAI lance, dans l'ordre de leur exécution. Une description complète de chaque task peut être trouvée dans la [section tasks](http://fai-project.org/fai-guide/#tasks) du guide FAI. + +* confdir +* setup +* defclass +* defvar +* action +* sysinfo +* inventory +* install +* dirinstall +* softupdate +* partition +* mountdisks +* extrbase +* debconf +* repository +* updatebase +* instsoft +* configure +* tests +* finish +* chboot +* savelog +* faiend + +Les `hooks` servent à lancer des script avant l'exécution d'un `task`. Cela donne très grande liberté sur le processus d'installation. + +Pour être valides, les `hooks` doivent être des scripts en Bourne Shell (`/bin/sh`) placés dans le dossier `hooks` en suivant la convention suivante: `task.CLASS[.sh]` + +Ainsi, `partition.DEBIAN` roule avant la partition des disques pour les machines qui ont la classe DEBIAN. `partition.DEBIAN.sh` aurait été tout aussi valide. + +Attention! Certaines restrictions s'appliquent: + +* Il n'est pas possible de lancer un `hook` avec une autre classe que `DEFAULT`, `$HOSTNAME` ou LAST avant la fin du `task` `defclass` +* Tous les `hooks` lancés avant le `task` `confdir` doivent être placés dans $nfsroot/$FAI/hooks + +# fai-cd + +Maintenant que nous avons mis en place un fai-server minimal et que nous avons créé la configuration des clients que nous allons installer, nous allons créer des images ISO complètes. + +Par défaut FAI utilise `dracut` pour les images ISO. La version de dracut dans Debian Jessie n'est cependant pas à même de faire ce dont FAI a besoin. Il est donc nécessaire soit d'utiliser la version de `dracut` de stretch, ou alors d'utiliser les packages dans le repository de FAI. + +Plutôt que d'utiliser `dracut`, nous allons utiliser `live-boot`. Cela nécessite de commenter les lignes concernant `dracut` et d'activer celles pour `live-boot` dans `/etc/fai/NFSROOT`: + +~~~ +# dracut can replace live-boot +#dracut-network live-boot- initramfs-tools- + +# choose if you like live-boot or dracut inside the nfsroot +live-boot live-boot-doc +~~~ + +La première étape pour obtenir un fai-cd est de créer un miroir complet des packages dont nous allons avoir besoin. De cette manière nous pourrons faire notre installation sans avoir besoin du réseau ou d'une connexion au fai-server. + +On commence donc par créer un dossier où nous allons générer le miroir: + +~~~ +# mkdir /srv/fai/mirror +~~~ + +Pour que `fai-mirror` puisse télécharger les packages nécessaires, il a besoin d'une copie du dossier `/etc/apt/trusted.gpg.d`: + +~~~ +# mkdir -p /srv/fai/mirror/aptcache/etc/apt/ +# cp -R /etc/apt/trusted.gpg.d/ /srv/fai/mirror/aptcache/etc/apt/ +~~~ + +On peut par la suite rouler l'utilitaire `fai-mirror`: + +~~~ +# fai-mirror -v /srv/fai/mirror +~~~ + +Cette étape prends un peu de temps (la machine télécharge l'ensemble des packages qui vont être utilisés, etc.) et peut créer un miroir d'une taille substantielle, tout dépendant de nos configurations. Par exemple, un miroir de toutes les classes dans la configuration donnée en exemple crée un dossier d'environ 1G. + +Si l'on connaît à l'avance les classes que l'on souhaite utiliser lors pour notre image ISO, on peut également construire un miroir partiel: + +~~~ +# fai-mirror -v -cCLASS1,CLASS2,CLASS3 /srv/fai/mirror +~~~ + +Une fois que l'on a un miroir qui correspond à nos besoins, on peut créer notre image ISO: + +~~~ +# fai-cd -m /srv/fai/mirror /srv/fai/myfai.iso +~~~ + +Il se peut que `fai-cd` se termine avec un message d'erreur à propos du NFSROOT non-compatible avec une image live. En quel cas, il est nécessaire de recréer le NFSROOT avec l'option `live`: + +~~~ +# rm -R /srv/fai/nfsroot +# fai-make-nfsroot -lv +~~~ + +Et voilà! Il ne reste plus qu'à installer une nouvelles machine avec l'image que l'on viens de créer. Lors du processus d'installation, il est bien important de spécifier un hostname lié à un ensemble de classe pour installer la bonne configuration! \ No newline at end of file diff --git a/HowtoFMS.md b/HowtoFMS.md new file mode 100644 index 00000000..f71a197b --- /dev/null +++ b/HowtoFMS.md @@ -0,0 +1,20 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Howto FMS : Flash Media Server + +Par défaut FMS écoute sur les ports TCP 1935, 80 et 8080. +Pour qu'il n'écoute que sur le port 1935. + +Pour changer cela, changer dans le conf/fms.ini : + +~~~ +ADAPTOR.HOSTPORT = :1935 +~~~ + +Ainsi que dans conf/_defaultRoot_/Adaptor.xml : + +~~~ + + ${HTTPPROXY.HOST} + +~~~ \ No newline at end of file diff --git a/HowtoFail2Ban.md b/HowtoFail2Ban.md new file mode 100644 index 00000000..8bdb7e2a --- /dev/null +++ b/HowtoFail2Ban.md @@ -0,0 +1,391 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Fail2Ban + +Fail2Ban est un service (en Python), qui scanne les logs applicatifs à la recherche d'échec de connexions pour bannir (via iptables) les adresses IP qui font trop de tentatives. +Il est disponible en version 0.8.4-3 pour Squeeze et 0.8.6-3 pour Wheezy. Un backport pour Squeeze est [disponible](https://packages.debian.org/squeeze-backports/fail2ban) + +## Installation + +~~~ +# aptitude install fail2ban +~~~ + +## Configuration + +Cela se passe dans le répertoire /etc/fail2ban + +Le principe repose sur un système de règles basées sur des regex correspondant à applicatif. + +Par défaut les règles pour SSH sont activées , voici comment ça se composer + +*filter.d/sshd.conf* contient les regex correspondant à SSH + +jail.conf est le fichier principal activant (ou pas) les règles avec différents paramètres + +~~~ +[ssh] + +enabled = true +port = ssh +filter = sshd +logpath = /var/log/auth.log +maxretry = 6 + +~~~ + +On peut régler plusieurs paramètres, comme le maxretry (nombres d'échecs) dans la section [DEFAULT] ou pour chaque applicatif. + +## Règles + +On peut évidemment écrire ses propres règles. On pourra les tester ainsi : + +~~~ +# fail2ban-regex /tmp/mail.log filter.d/sasl-test.conf +~~~ + +## Administration + +On peut lister les "jails" : + +~~~ +# fail2ban-client status +|- Number of jail: NN +`- Jail list: ... +~~~ + +On va les retrouver aussi avec `iptables -L -n` + +Pour débannir une IP : + +~~~ +# fail2ban-client set unbanip +~~~ + + +## Exemples + +### Dovecot + +Il faut ajouter des règles personnalisées : + +~~~ +[dovecot-pop3imap] +enabled = true +filter = dovecot-pop3imap +port = pop3,pop3s,imap,imaps +logpath = /var/log/mail.log +~~~ + +Filtre dovecot, filter.d/dovecot-pop3imap.conf + +~~~ +[Definition] +failregex = (?: pop3-login|imap-login): .*(?:Authentication failure|Aborted login \(auth failed|Aborted login \(tried to use disabled|Disconnected \(auth failed|Aborted login \(\d+ authentication attempts).*rip=(?P\S*),.* +ignoreregex = +~~~ + +## Courier + +Il suffit d'activer la règle courierlogin prédéfinie : + +~~~ +[courierauth] + +enabled = true +port = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s +filter = courierlogin +logpath = /var/log/mail.log +~~~ + +## Postfix SASL + +Il faut modifier la règle SASL prédéfinie : + +~~~ +[sasl] + +enabled = true +port = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s +filter = sasl-evolix +logpath = /var/log/mail.log +~~~ + +avec filter.d/sasl-evolix.conf : + +~~~ +[Definition] +failregex = (?i): warning: [-._\w]+\[\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed: +ignoreregex = +~~~ + +## Services HTTP + +Il est possible d'utiliser `fail2ban` sur des sites web pour ajouter une couche de protection contre les attaques, ou alors pour répondre à une attaque en cours. + +Les deux attaques les plus courantes sur les services HTTP sont les DDOS et les attaques en "brute force". + +Pour les attaques de type DDOS, la chose la plus efficace à faire est d'écrire des règles pour le serveur web (Apache, Nginx, etc.) + +Comme `fail2ban` a besoin d'être configuré au cas par cas, il faut utiliser des configurations différentes pour chaque plateforme web. + +En général, on tente d'être le plus précis possible en configurant `fail2ban` pour regarder les logs d'authentification. Cela permet d'éviter les faux positifs et d'être efficace en cas d'attaque. + +### Apache & Nginx DDOS + +On peut protéger Apache des attaques DDOS simples avec les configurations suivantes. Il faut tout d'abord s'assurer qu'Apache enregistre des logs d'accès. On ajoute ensuite un filtre à `fail2ban` dans `/etc/fail2ban/filter.d/ddos- + +~~~ +failregex = ^ -.*GET +~~~ + +Finalement, on modifie `/etc/fail2ban/jail.local` pour ajouter une des deux règles suivantes. Avec cette règle, une personne qui accède plus de 300 fois à une page web sur notre serveur web en 5 minutes va être bannie pendant la période de temps par défaut: + +~~~ +[ddos-] +enabled = true +port = +filter = ddos-http +logpath = /var/log/apache2/access.log +maxretry = 300 +findtime = 300 +~~~ +~~~ +[ddos-] +enabled = true +port = +filter = ddos-http +logpath = /var/log/nginx/access.log +maxretry = 300 +findtime = 300 +~~~ + +### Wordpress + +Il existe plusieurs options pour configurer `fail2ban` pour Wordpress. Cela découle du fait qu'il n'y a pas de moyen par défaut de logger les authentifications erronées sous Wordpress, et que la page d'authentification ne renvoie pas d'erreur HTTP particulière non plus. ["Une proposition à cet effet"](https://core.trac.wordpress.org/ticket/25446) a cependant été faite et risque éventuellement d'être implémentée. + +#### Option 1: HTPP 200 + +Cette option est la plus simple des trois car elle ne nécessite pas de modifier l'installation Wordpress. Elle a cependant le désavantage d'être très générale et peu créer des faux positifs. C'est celle qui est actuellement utilisée par Évolix. + +Il faut tout d'abord s'assurer que notre serveur web enregistre des logs d'accès. On ajoute ensuite un filtre à `fail2ban` dans `/etc/fail2ban/filter.d/apache-wp.conf`: + +~~~ +[Definition] +failregex = -.*"POST.*/wp-login.php HTTP.* 200 + -.*"POST.*/xmlrpc.php.* +~~~ + +Finalement, on modifie `/etc/fail2ban/jail.local` pour ajouter une règle. Avec cette règle, une personne qui accède plus de 5 fois à la page `/wp-login.php` ou à `/xmlrpc.php` dans une période d'une minute va être bannie pendant la période de temps par défaut: + +~~~ +[apache-wp] +enabled = true +port = +filter = apache-wp +logpath = /var/log/apache2/access.log +maxretry = 5 +findtime = 60 +~~~ + +#### Option 2: Plugin simple & HTTP 401 + +Une seconde option est d'utiliser un plugin Wordpress très simple pour envoyer une erreur HTTP 401 en cas d'erreur d'authentification. Cette méthode est plus fine et créé moins de faux positifs, mais nécessite de toucher à l'installation Wordpress. + +Elle est cependant peu invasive car elle fait installe le plugin dans [wp-content/mu-plugins](https://codex.wordpress.org/Must_Use_Plugins), un dossier spécial pour les plugins de ce genre. Typiquement, les mu-plugins ne sont pas vu à travers l'interface d'administration web. + +Il faut tout d'abord s'assurer que notre serveur web enregistre des logs d'accès. Par la suite, on installe le plugin dans `wp-content/mu-plugins/401-on-login-fail.php`: + +~~~ +.*POST.*(wp-login\.php|xmlrpc\.php).* 401 +~~~ + +Finalement, on modifie `/etc/fail2ban/jail.local` pour ajouter une règle. Avec cette règle, une personne qui accède plus de 5 fois à la page `/wp-login.php` ou à `/xmlrpc.php` dans une période d'une minute va être bannie pendant la période de temps par défaut: + +~~~ +[apache-wp] +enabled = true +port = +filter = apache-wp +logpath = /var/log/apache2/access.log + /home/user/log/access.log +maxretry = 5 +findtime = 60 +~~~ + +#### Option 3: Plugin régulier & LOG_AUTH + +La dernière solution utilise le [le plugin Wordpress fail2ban](https://wordpress.org/plugins/wp-fail2ban/) pour enregistrer les authentification dans un fichier de log. `fail2ban` vérifie par la suite ce fichier pour bannir les gens effectuant des attaques. + +Parce qu'elle nécessite l'installation et la mise à jour régulière d'un plugin, elle ne devrait être utilisée que par les personnes administrant le site web en question. + +On commence tout d'abord par [installer le plugin](https://wordpress.org/plugins/wp-fail2ban/). Une fois que cela est fait, on ajoute les deux filtres suivants, respectivement dans `etc/fail2ban/filter.d/wordpress-hard` et `etc/fail2ban/filter.d/wordpress-soft`: + +~~~ +# Fail2Ban configuration file hard +# +# Author: Charles Lecklider +# + +[INCLUDES] + +# Read common prefixes. If any customizations available -- read them from +# common.local +before = common.conf + + +[Definition] + +_daemon = (?:wordpress|wp) + +# Option: failregex +# Notes.: regex to match the password failures messages in the logfile. The +# host must be matched by a group named "host". The tag "" can +# be used for standard IP/hostname matching and is only an alias for +# (?:::f{4,6}:)?(?P[\w\-.^_]+) +# Values: TEXT +# +failregex = ^%(__prefix_line)sAuthentication attempt for unknown user .* from ( via XML-RPC)?$ + ^%(__prefix_line)sBlocked authentication attempt for .* from ( via XML-RPC)?$ + ^%(__prefix_line)sBlocked user enumeration attempt from $ + ^%(__prefix_line)sPingback error .* generated from $ + +# Option: ignoreregex +# Notes.: regex to ignore. If this regex matches, the line is ignored. +# Values: TEXT +# +ignoreregex = +~~~ +~~~ +# Fail2Ban configuration file soft +# +# Author: Charles Lecklider +# + +[INCLUDES] + +# Read common prefixes. If any customizations available -- read them from +# common.local +before = common.conf + + +[Definition] + +_daemon = (?:wordpress|wp) + +# Option: failregex +# Notes.: regex to match the password failures messages in the logfile. The +# host must be matched by a group named "host". The tag "" can +# be used for standard IP/hostname matching and is only an alias for +# (?:::f{4,6}:)?(?P[\w\-.^_]+) +# Values: TEXT +# +failregex = ^%(__prefix_line)sAuthentication failure for .* from $ + ^%(__prefix_line)sXML-RPC authentication failure from $ + +# Option: ignoreregex +# Notes.: regex to ignore. If this regex matches, the line is ignored. +# Values: TEXT +# +ignoreregex = +~~~ + +Finalement, on modifie `/etc/fail2ban/jail.local` pour ajouter les règles suivantes. Avec cette règle, une personne qui tente de se connecter avec un compte inexistant ou qui n'arrive pas à se connecter 5 fois sera bannie pendant la période de temps par défaut: + +~~~ +[wordpress-hard] + enabled = true + filter = wordpress-hard + logpath = /var/log/auth.log + maxretry = 1 + port = + +[wordpress-soft] + enabled = true + filter = wordpress-soft + logpath = /var/log/auth.log + maxretry = 5 + port = +~~~ + +### ownCloud + +Pour faire fonctionne ownCloud avec fail2ban, il faut tout d'abord modifier le `config.php` pour enregistrer les informations d'authentification: + +~~~ +'loglevel' => '2', +'log_authfailip' => true, +'logfile' => '/var/log/owncloud.log', +~~~ + +On ajoute ensuite un filtre à `fail2ban` dans `/etc/fail2ban/filter.d/owncloud.conf`: + +~~~ +[Definition] + failregex={"app":"core","message":"Login failed: user '.*' , wrong password, IP:","level":2,"time":".*"} +~~~ + +Finalement, on modifie `/etc/fail2ban/jail.local` pour ajouter une règle. Avec cette règle, une personne qui n'arrive pas à se connecter 5 fois dans une période de 10 minutes sera bannie pendant la période de temps par défaut: + +~~~ +[owncloud] + enabled = true + filter = owncloud + port = + logpath = /var/log/owncloud.log + maxrety = 5 + findtime = 600 +~~~ + +### Joomla + +Il faut tout d'abord s'assurer que notre serveur web enregistre des logs d'accès. On ajoute ensuite un filtre à `fail2ban` dans `/etc/fail2ban/filter.d/apache-joomla.conf`: + +~~~ +[Definition] + failregex = -.*"POST.*/administrator/index.php.* +~~~ + +Finalement, on modifie `/etc/fail2ban/jail.local` pour ajouter une règle. Avec cette règle, une personne qui accède plus de 5 fois à la page `/administrator/index.php` dans une période d'une minute va être bannie pendant la période de temps par défaut: + +~~~ +[apache-joomla] + enabled = true + port = + filter = apache-joomla + logpath = /var/log/apache2/access.log + maxretry = 5 + findtime = 60 +~~~ + +### Prestashop + +Il faut tout d'abord s'assurer que notre serveur web enregistre des logs d'accès. On ajoute ensuite un filtre à `fail2ban` dans `/etc/fail2ban/filter.d/apache-prestashop.conf`: + +~~~ +[Definition] + failregex = -.*"POST.*/login.* +~~~ + +Finalement, on modifie `/etc/fail2ban/jail.local` pour ajouter une règle. Avec cette règle, une personne qui accède plus de 10 fois à la page de connexion pour un compte utilisateur dans une période d'une minute va être bannie pendant la période de temps par défaut: + +~~~ +[apache-prestashop] + enabled = true + port = + filter = apache-prestashop + logpath = /var/log/apache2/access.log + maxretry = 10 + findtime = 60 +~~~ \ No newline at end of file diff --git a/HowtoFetchmail.md b/HowtoFetchmail.md new file mode 100644 index 00000000..7b3d0b96 --- /dev/null +++ b/HowtoFetchmail.md @@ -0,0 +1,33 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Fetchmail + +~~~ +apt install fetchmail +~~~ + +Config via /etc/fetchmailrc : + + +~~~ +set postmaster "postmaster" +set no spambounce +set no syslog +set logfile /var/log/fetchmail.log +set properties "" +set daemon 60 +set no bouncemail + +defaults +# Retrieve only new messages +#no fetchall +# Retrieve all messages +#fetchall +smtpaddress mail.example.com +# on vire le Deliver-To: pour eviter les boucles foireuses +dropdelivered + +poll pop.example.com with proto POP3 + +user 'jdoe@example.com' there with password 'PASS' is 'john@example.org' here +~~~ \ No newline at end of file diff --git a/HowtoFreeradius.md b/HowtoFreeradius.md new file mode 100644 index 00000000..54939f49 --- /dev/null +++ b/HowtoFreeradius.md @@ -0,0 +1,7 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Installation + +~~~ +aptitude install freeradius-utils freeradius freeradius-mysql freeradius-ldap +~~~ \ No newline at end of file diff --git a/HowtoGNS3.md b/HowtoGNS3.md new file mode 100644 index 00000000..a3e5ff42 --- /dev/null +++ b/HowtoGNS3.md @@ -0,0 +1,2 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + diff --git a/HowtoGParted.md b/HowtoGParted.md new file mode 100644 index 00000000..ee9e44cb --- /dev/null +++ b/HowtoGParted.md @@ -0,0 +1,86 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto GParted + + + +## Créer un Live USB + + + +1. Prendre une clé USB vierge, par exemple /dev/sdz + +Si elle n'est pas vierge, l'effacer en faisant quelques secondes : + +~~~ +# dd if=/dev/zero of=/dev/sdz +^C +~~~ + +2. Formater la clé USB en dos et créer une partition FAT32 : + +~~~ +# parted /dev/sdz + +(parted) p +Error: /dev/sdz: unrecognised disk label + +(parted) mklabel dos + +# mkfs.vfat -F 32 /dev/sdz1 +~~~ + +3. Télécharger la dernière version (.zip en amd64) sur + +4. Deziper sur le point de montage : + +~~~ +# mount /dev/sdz1 /mnt +# unzip gparted-live-0.26.1-5-amd64.zip -d /mnt/ +~~~ + +5. Lancer le script suivant en root et suivre les instructions : + +~~~ +# apt install libc6-i386 +# bash /mnt/utils/linux/makeboot.sh /dev/sdz1 +This command will install MBR and syslinux bootloader on this machine +-------------------------------------------- +Machine: 20BSCT42XY: +Model: SanDisk (scsi) +Disk /dev/sdc: 4005MB +Sector size (logical/physical): 512B/512B +Partition Table: msdos +Disk Flags: + +Number Start End Size Type File system Flags + 1 1049kB 4005MB 4003MB primary fat32 boot, hidden, lba + +-------------------------------------------- +Are you sure you want to continue? +[y/n] y +OK! Let's do it! +-------------------------------------------- +File system of /dev/sdc1: vfat +-------------------------------------------- +Do you want to install mbr on /dev/sdc on this machine "20BSCT42XY" ? +[y/n] y +OK! Let's do it! +-------------------------------------------- +Do you want to install the SYSLINUX bootloader on /dev/sdc1 on this machine "20BSCT42XY" ? +[y/n] y +OK! Let's do it! +A filesystem supporting Unix file mode for syslinux is required. Copying syslinux from FAT to /tmp/... +'/mnt/utils/linux/syslinux' -> '/tmp/syslinux_tmp.ZISOfr/syslinux' +Running: /tmp/syslinux_tmp.ZISOfr/syslinux -d syslinux -f -i /dev/sdc1 +done! +//NOTE// If your USB flash drive fails to boot (maybe buggy BIOS), try to use "syslinux -d syslinux -fs /dev/sdc1", i.e. running with "-fs". + +~~~ + +6. umount et c'est prêt ! + +~~~ +# umount /mnt +# sync +~~~ \ No newline at end of file diff --git a/HowtoGPhoto.md b/HowtoGPhoto.md new file mode 100644 index 00000000..51ce9bef --- /dev/null +++ b/HowtoGPhoto.md @@ -0,0 +1,17 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Gphoto + +~~~ +# aptitude install gphoto2 +~~~ + +~~~ +Lister les fichiers : +$ gphoto2 -L +Obtenir un fichier : +$ gphoto2 -p +Obtenir tous les fichiers : +$ gphoto2 --get-all-files +~~~ + diff --git a/HowtoGRSEC.md b/HowtoGRSEC.md new file mode 100644 index 00000000..33fa98f9 --- /dev/null +++ b/HowtoGRSEC.md @@ -0,0 +1,23 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Howto GRSEC + +### Enlever une protection + +Installation des paquets nécessaires : + +~~~ +aptitude install chpax +~~~ + +Pour une lib : + +~~~ +# execstack -c /usr/lib/libfoo.so +~~~ + +Pour un binaire : + +~~~ +# chpax -permsx /usr/local/bin/wkhtmltopdf +~~~ \ No newline at end of file diff --git a/HowtoGaneti.md b/HowtoGaneti.md new file mode 100644 index 00000000..7ffc3f9b --- /dev/null +++ b/HowtoGaneti.md @@ -0,0 +1,40 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Ganeti + + + + + + + +~~~ +# aptitude install ganeti2 +~~~ + +* Config bridge br0 +* Config /etc/hostname +* Config LVM d'un VG +* Utilisation d'un IP pour le cluster +* mkdir /root/.ssh/ + +~~~ +# /etc/init.d/ganeti stop +# gnt-cluster init --enabled-hypervisors=kvm --master-netdev br0 -g vg mycloud +# gnt-node add node01 +-- WARNING -- +Performing this operation is going to replace the ssh daemon keypair +on the target machine (node01.example.com) with the ones of the current one +and grant full intra-cluster ssh root access to/from it + +The authenticity of host 'xxx' can't be established. +RSA key fingerprint is 70:69:4b:d8:33:68:b5:77:c4:be:6e:85:9a:62:08:bb. +Are you sure you want to continue connecting (yes/no)? yes +root@node01's password: +Mon Nov 29 13:36:57 2010 - INFO: Node will be a master candidate + +root@node00:~# gnt-node list +Node DTotal DFree MTotal MNode MFree Pinst Sinst +node00 232.2G 232.2G 31.5G 195M 31.3G 0 0 +node01 232.2G 232.2G 31.5G 154M 31.3G 0 0 +~~~ diff --git a/HowtoGearman.md b/HowtoGearman.md new file mode 100644 index 00000000..4711b714 --- /dev/null +++ b/HowtoGearman.md @@ -0,0 +1,43 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Gearman + +Installation : + +~~~ +# aptitude install gearman gearman-job-server +~~~ + +Vérification du statut / fonctionnement : + +~~~ +$ telnet 127.0.0.1 4730 + +STATUS +foo 310 2 2 +bar 0 0 1 +coin 0 0 1 +plop 0 0 1 +. + +WORKERS +14 127.0.0.1 - : +13 127.0.0.1 - : foo +12 127.0.0.1 - : bar coin plop +11 127.0.0.1 - : foo +. +~~~ + +Utilisation avec PHP : + +~~~ +$ pecl download gearman-1.0.3 +$ dh-make-pecl --phpversion 5 --prefix php5- gearman-1.0.3.tgz +$ cd php5-gearman-1.0.3/ +$ ./debian/rules binary +# dpkg -i ../php5-gearman_1.0.3-1_amd64.deb +~~~ + +Note : si vous obtenez des erreurs du type `PHP Fatal error: Uncaught exception 'GearmanException' with message 'Failed to set exception option` + +Précisez le HOST et PORT pour la fonction addServer : _addServer("127.0.0.1", 4730)_ diff --git a/HowtoGeoIP.md b/HowtoGeoIP.md new file mode 100644 index 00000000..cfb73a0a --- /dev/null +++ b/HowtoGeoIP.md @@ -0,0 +1,35 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto GeoIP + +GeoIP est un service de [maxmind](http://www.maxmind.com/app/ip-locate), ils proposent des base de données de localisation géographique des adresses IP, grauit ou payant, selon les besoins. + +Il existe sous debian des paquets permettant de s'en servir _out-of-the-box_. +En installant les paquets `geoip-bin` et `geoip-database` on peut déjà se servir de GeopIP en terminal. + +~~~ +$ geoiplookup 85.31.205.43 +GeoIP Country Edition: FR, France + +~~~ + +En téléchargeant la base de données plus précise, on peut aller jusqu'à la ville, il faut pour cela télécharger la base [GeoLite City](http://www.maxmind.com/app/geolitecity) et l'extraire dans /usr/share/GeoIP/ +Puis on peut intérogger la base de données ainsi : + +~~~ +$ geoiplookup -l -f /usr/share/GeoIP/GeoLiteCity.dat 209.85.227.103 +GeoIP City Edition, Rev 1: US, CA, Mountain View, 94043, 37.419201, -122.057404, 807, 650 +~~~ + +Notez que la version gratuite n'est pas précise en france : + +~~~ +geoiplookup -l -f /usr/share/GeoIP/GeoLiteCity.dat 85.31.205.43 +GeoIP City Edition, Rev 1: FR, (null), (null), (null), 46.000000, 2.000000, 0, 0 +~~~ + +/!\ Ceci est en fait un bug de geoiplookup, en utilisant les scripts [PHP](http://geolite.maxmind.com/download/geoip/api/php/), on obtient bien une adresse précise. + +À noter que la version gratuite n'est pas précise pour de nombreuses adresses IP de FAI, la version payante contient plus d'informations, exemple [ici](http://www.maxmind.com/app/lookup_city). + +Il existe plusieurs APIs, vous pouvez donc faire des requêtes sur la base de données avec un module apache ou bien en PHP par exemple. Le site de maxmind liste toutes les [APIs disponibles](http://www.maxmind.com/app/api). \ No newline at end of file diff --git a/HowtoGit/Github.md b/HowtoGit/Github.md new file mode 100644 index 00000000..242eda24 --- /dev/null +++ b/HowtoGit/Github.md @@ -0,0 +1,17 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Github + +On fork un projet via l'interface web, puis récupère le fork : + +~~~ +$ git clone git@github.com:gcolpart/phpredis.git +~~~ + +On code, on code, on commit... puis on se resynchronise avec le projet principal : + +~~~ +$ git remote add upstream git://github.com/nicolasff/phpredis.git +$ git fetch upstream +$ git merge upstream/master (ou rebase ?) +~~~ diff --git a/HowtoGitDaemon.md b/HowtoGitDaemon.md new file mode 100644 index 00000000..47843a26 --- /dev/null +++ b/HowtoGitDaemon.md @@ -0,0 +1,48 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowToGitDeamon + +## Prérequis + +Installation du service git-daemon : +~~~ +aptitude install git-daemon-sysvinit +~~~ +Configuration du démon Git /etc/default/git-daemon : +~~~ +cat > /etc/default/git-daemon < + +## Particularités pour Debian Wheezy (7) + +Il faut Ruby >=2.1 et GCC >=4.9, il faudra donc les installer depuis le dépôt sid. +Mettre en place le repo sid et du pinning : + +/etc/apt/sources.list +~~~ +deb sid main +~~~ + +/etc/apt/preferences.d/ruby +~~~ +Package: ruby gcc-4.9 +Pin: release n=sid +Pin-Priority: 600 + +Package: * +Pin: release n=sid +Pin-Priority: 50 +~~~ + +Et d'installer les packages ruby et gcc4.9, en faisant attention avec la gestion des dépendances. \ No newline at end of file diff --git a/HowtoGitWeb.md b/HowtoGitWeb.md new file mode 100644 index 00000000..92f63b63 --- /dev/null +++ b/HowtoGitWeb.md @@ -0,0 +1,76 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowtoGitWeb + +## Prérequis + +Installation de gitweb et highlight : +~~~ +aptitude install gitweb highlight +~~~ + +### Configuration Nginx + +Installation de fcgiwrapper : +~~~ +aptitude install fcgiwrap +~~~ +Modifier /etc/gitweb.conf et remplacer les lignes suivantes : +~~~ +$projectroot = $ENV{'GITWEB_PROJECTROOT'} || "/pub/git"; +$projects_list = $ENV{'GITWEB_PROJECTLIST'} || $projectroot; +~~~ +Rajout de la conf highlight : +~~~ +cat >> /etc/gitweb.conf < /etc/nginx/sites-available/gitweb_$GIT < + +## Installation Glassfish 2 + +Installer le JDK Java 6 : + +~~~ +# aptitude install sun-java6-jdk +~~~ + +Créer un utilisateur glassfish et l'utiliser : + +~~~ +# useradd -m -d /srv/glassfish glassfish +# su glassfish +~~~ + +Télécharger la dernière version du logiciel (exemple pour Glassfish 2.1.1) : + +~~~ +$ wget +~~~ + +Exécuter le JAR : + +~~~ +$ java -Xmx256m -jar glassfish-installer-v2.1.1-b31g-linux.jar +~~~ + +Se déplacer dans le répertoire `glassfish` et positionner les droits sur les binaires : + +~~~ +$ cd glassfish +$ chmod -R +x lib/ant/bin/* +~~~ + +Exécuter _ant_ (on fait ici une installation en mode _cluster_) : + +~~~ +$ lib/ant/bin/ant -f setup-cluster.xml +~~~ + +### Démarrage + +Exécuter la commande suivante, et patienter le temps du chargement : + +~~~ +$ ./bin/asadmin start-domain +~~~ + +L'interface d'admin est alors normalement disponible sur le port TCP/4848. + +Note : attention, bien ajuster le fichier _/etc/hosts_ sous peine d'obtenir une erreur du type : +`[...] Unable to determine local hostname from InetAddress.getLocalHost().getHostName() [...] ` + +### Enregistrer le mot de passe admin + +~~~ +$ ./bin/asadmin login +~~~ + +Puis saisir l'identifiant et le mot de passe du compte admin. +Ces infos seront sauvées dans `$HOME/.asadminpass`. + +Note : attention, il faut avoir démarrer (start-domain) avant de pouvoir faire cette commande + +### Pour modifier le mot de passe admin + +* Modifier dans l'interface d'admin de Glassfish +* Supprimer `$HOME/.asadminpass` +* relancer asadmin start-domain et suivre les instructions... + +### Notes + +* Ports à voir +* Script d'init.d à positionner +* Pour utiliser l'admin, éviter Firefox (pages blanches) + +## Installation Glassfish 3 ou 4 + +v3.0 : + +v3.1 : + +v4 : + +~~~ +$ wget +$ unzip glassfish-3.1.zip +$ cd glassfishv3 +$ ./bin/asadmin +Use "exit" to exit and "help" for online help. +asadmin> version +Version string could not be obtained from Server [localhost:4848] for some reason. +(Turn debugging on e.g. by setting AS_DEBUG=true in your environment, to see the details). +Using locally retrieved version string from version class. +Version = GlassFish Server Open Source Edition 3.1 (build 43) +Command version executed successfully. +asadmin> exit +Command multimode executed successfully. +~~~ + +### 4.1 + + +~~~ +# adduser --disabled-password glassfish +# sudo -iu glassfish +$ wget +$ unzip glassfish-4.1.zip +~~~ + + diff --git a/HowtoGratuitousARP.md b/HowtoGratuitousARP.md new file mode 100644 index 00000000..487edf71 --- /dev/null +++ b/HowtoGratuitousARP.md @@ -0,0 +1,23 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Gratuitous ARP + +## Compilation de send_arp.c + +send_arp.c est le code source de l'utilitaire fourni dans HeartBeat pour générer des Gratuitous ARP. + +~~~ +$ wget +~~~ + +Commentez la ligne 348 et 366, puis compiler avec gcc (vous devez avoir le paquet build-essential d'installé) : + +~~~ +gcc send_arp.linux.c -o send_arp +~~~ + +Pour générer un gratuitous ARP : + +~~~ +send_arp -U -c 3 -I eth3 IP && send_arp -A -c 3 -I eth3 IP +~~~ \ No newline at end of file diff --git a/HowtoHDPARM.md b/HowtoHDPARM.md new file mode 100644 index 00000000..ce2547a4 --- /dev/null +++ b/HowtoHDPARM.md @@ -0,0 +1,177 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto HDPARM + +HDPARM est un outil pour visualiser et changer les paramètres d'un disque IDE (PATA et SATA). + +## Commandes HDPARM utiles + +Voir les caractéristiques d'un disque : + +~~~ +# hdparm -i /dev/hda + +/dev/hda: + + Model=QUANTUM FIREBALL SE2.1A, FwRev=API.0D00, SerialNo=632804253921 + Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs } + RawCHS=4092/16/63, TrkSize=32256, SectSize=512, ECCbytes=4 + BuffType=DualPortCache, BuffSize=80kB, MaxMultSect=16, MultSect=off + CurCHS=4092/16/63, CurSects=4124736, LBA=yes, LBAsects=4124736 + IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120} + PIO modes: pio0 pio1 pio2 pio3 pio4 + DMA modes: sdma0 sdma1 sdma2 mdma0 mdma1 mdma2 udma0 udma1 *udma2 + AdvancedPM=no + Drive Supports : Reserved : ATA-1 ATA-2 ATA-3 + +# hdparm -i /dev/sda + +/dev/sda: + + Model=INTEL SSDSA2M080G2GC, FwRev=2CV102HD, SerialNo=CVPO037003CR080JGN + Config={ Fixed } + RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=0 + BuffType=unknown, BuffSize=unknown, MaxMultSect=16, MultSect=1 + CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=156301488 + IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120} + PIO modes: pio0 pio3 pio4 + DMA modes: mdma0 mdma1 mdma2 + UDMA modes: udma0 udma1 *udma2 udma3 udma4 udma5 udma6 + AdvancedPM=no WriteCache=enabled + Drive conforms to: ATA/ATAPI-7 T13 1532D revision 1: ATA/ATAPI-2,3,4,5,6,7 +* signifies the current active mode +~~~ + +Voir les paramètres d'un disque : + +~~~ +# hdparm /dev/sda + +/dev/sda: + multcount = 1 (on) + IO_support = 1 (32-bit) + readonly = 0 (off) + readahead = 256 (on) + geometry # 9729/255/63, sectors 156301488, start = 0 +~~~ + +Tester les performances d'accès au disque *sans* système de cache (cette opération doit +être faite sur un système inactif et répétée 2 ou 3 fois pour être significative) : + +~~~ +# hdparm -t /dev/sda + +/dev/sda: + Timing buffered disk reads: 384 MB in 3.01 seconds = 127.37 MB/sec + +# hdparm -t /dev/sda + +/dev/sda: + Timing buffered disk reads: 386 MB in 3.01 seconds = 128.45 MB/sec + +# hdparm -t /dev/sda + +/dev/sda: + Timing buffered disk reads: 388 MB in 3.01 seconds = 128.84 MB/sec +~~~ + +Tester les performances d'accès au disque *avec* système de cache (cette opération doit +être faite sur un système inactif et répétée 2 ou 3 fois pour être significative) : + +~~~ +# hdparm -T /dev/sda + +/dev/sda: + Timing cached reads: 12192 MB in 2.00 seconds = 6099.63 MB/sec + +# hdparm -T /dev/sda + +/dev/sda: + Timing cached reads: 16332 MB in 2.00 seconds = 8172.65 MB/sec + +# hdparm -T /dev/sda + +/dev/sda: + Timing cached reads: 15110 MB in 2.00 seconds = 7560.25 MB/sec +~~~ + +Activer le DMA : + +~~~ +# hdparm -d1 /dev/hda + +/dev/hda: + setting using_dma to 1 (on) + using_dma = 1 (on) +~~~ + +Activer le 32-bit I/O support : + +~~~ +# hdparm -c1 /dev/hda + +/dev/hda: + setting 32-bit I/O support flag to 1 + I/O support = 1 (32-bit) +~~~ + +Désactiver le write cache : + +~~~ +# hdparm -W0 /dev/sda + +/dev/sda: + setting drive write-caching to 0 (off) + write-caching = 0 (off) +~~~ + +## Optimisations d'un disque PATA + +On observe les temps d'accès d'un disque : + +~~~ +# hdparm -tT /dev/hda + +/dev/hda: + Timing buffer-cache reads: 128 MB in 2.79 seconds = 45.88 MB/sec + Timing buffered disk reads: 64 MB in 12.99 seconds = 4.93 MB/sec +~~~ + +On observe l'état de votre disque : + +~~~ +# hdparm /dev/hda +/dev/hda: + multcount = 0 (off) + I/O support = 0 (default 16-bit) + unmaskirq = 0 (off) + using_dma = 0 (off) + keepsettings = 0 (off) + nowerr = 0 (off) + readonly = 0 (off) + readahead = 8 (on) + geometry # 1023/64/63, sectors 4124736, start = 0 + busstate = 1 (on) +~~~ + +On choisir d'activer le DMA et le 32 bit : + +~~~ +# hdparm -d1 -c1 /dev/hda + +/dev/hda: + setting 32-bit I/O support flag to 1 + setting using_dma to 1 (on) + I/O support = 1 (32-bit) + using_dma = 1 (on) +~~~ + +Puis on reteste notre disque : + +~~~ +# hdparm -tT /dev/hda + +/dev/hda: + Timing buffer-cache reads: 128 MB in 2.78 seconds = 46.04 MB/sec + Timing buffered disk reads: 64 MB in 7.04 seconds = 9.09 MB/sec +~~~ diff --git a/HowtoHG.md b/HowtoHG.md new file mode 100644 index 00000000..974f9746 --- /dev/null +++ b/HowtoHG.md @@ -0,0 +1,165 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Mercurial + + + +Sous Debian, pour installer Mercurial : + +~~~ +# aptitude install mercurial +~~~ + +## Utilisation + +Configurer son client : + +~~~ +$ cat ~/.hgrc +[ui] +username = John Doe +verbose = True +~~~ + +Créer un dépôt : + +~~~ +$ mkdir -p foo && cd foo +$ hg init +~~~ + +Cloner un dépôt : + +~~~ +$ hg clone +destination directory: repo1 +requesting all changes +adding changesets +adding manifests +adding file changes +added 40 changesets with 85 changes to 19 files +updating working directory +15 files updated, 0 files merged, 0 files removed, 0 files unresolved +~~~ + + +Ajouter un nouveau fichier au dépôt : + +~~~ +$ hg add monfichier +~~~ + +Valider les modifications apportées au dépôt : +~~~ +$ hg commit +Mon message de commit +HG: Enter commit message. Lines beginning with 'HG:' are removed. +HG: -- +HG: user: user@host +HG: branch 'default' +HG: changed monfichier +~~~ + +Envoyer les modifications sur le dépôt : +~~~ +$ hg push +pushing to +http authorization required +realm: Password protected +user: user@host +password: +searching for changes +adding changesets +adding manifests +adding file changes +added 1 changesets with 1 changes to 1 files +~~~ + +Récupérer la dernière version d'un dépôt : +~~~ +$ hg pull +searching for changes +no changes found +~~~ + +Placer le _working directory_ dans une version particulière : + +~~~ +$ hg update 19 +9 files updated, 0 files merged, 4 files removed, 0 files unresolved +~~~ + +## HGWEB + +HGWEB sert à naviguer dans les dépôts par une interface web, mais surtout +à utiliser Mercurial via HTTP. + +~~~ +# aptitude install libapache2-mod-wsgi +# mkdir /home/hg +# cp /usr/share/doc/mercurial-common/examples/hgweb.wsgi /home/hg/ +# sed -i 's@/path/to/repo/or/config@/home/hg/hgweb.config@' /home/hg/hgweb.wsgi +# cat /home/hg/hgweb.config +[paths] +test = /home/hg/test +coin = /home/hg/coin + +[web] +#allow_push = * +baseurl = / +push_ssl = false +# chown -R www-data:www-data /home/hg +~~~ + +Il reste maintenant à activer un VirtualHost. +Par exemple avec un authentification LDAP : + +~~~ + + + ServerName hg.example.com + DocumentRoot /home/hg/www + + #WSGIDaemonProcess hg user=hg group=hg processes=2 maximum-requests=5000 + WSGIScriptAlias / /home/hg/hgweb.wsgi + + + Allow from all + Options ExecCGI FollowSymlinks + + + + AuthType Basic + AuthName "Reserved access" + AuthBasicProvider ldap + AuthzLDAPAuthoritative on + AuthLDAPURL "ldap://ldap.example.com:389/ou=people,dc=example,dc=com?uid?sub?(objectClass=*)" + Require ldap-group cn=hg,ou=group,dc=example,dc=com + + Require ldap-group cn=hg-push,ou=group,dc=example,dc=com + + + + +~~~ + +Il reste à gérer les droits du répertoire /home/hg devant appartenir à l'utilisateur web +(par exemple via ACL ou Apache-ITK). + +## FAQ + +* Lorsque je push en SSH, j'obtiens : +~~~ +remote: abandon : There is no Mercurial repository here (.hg not found) ! +abandon : no suitable response from remote hg ! +~~~ + +Il faut mettre un double slash (//) après le hostname. Voir notamment + +* Lorsque je push en HTTP, j'obtiens : +~~~ +ssl required +~~~ + +Il faut passer en HTTPS. Si vraiment, on veut le faire en HTTP non sécurisé, il faut le forcer au niveau du serveur via _push_ssl = false_ +Voir \ No newline at end of file diff --git a/HowtoHearthbeat.md b/HowtoHearthbeat.md new file mode 100644 index 00000000..1d2c19bc --- /dev/null +++ b/HowtoHearthbeat.md @@ -0,0 +1,255 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Hearthbeat + +Documentation officielle : + +## Tuer un Hearthbeat planté + +Pour tuer un heathbeat planté, il faut +~~~ +root@> ps aux |grep hearthbeat +root@> kill -9 #pid +root@> /etc/init.d/hearthbeat stop +root@> /etc/init.d/hearthbeat start +~~~ + +Cela permet de tuer le binaire, libérer les ressources utilisées par hearthbeat, et redémarrer le service. + +## Hearthbeat 3 +À partir de Debian Squeeze c'est Heartbeat 3 qui est inclus dans les packages, de nombreuses choses ont changées, entre autres, le fichier de configuration principal. +Installation : `aptitude install heartbeat cluster-glue` + +### Mettre en place un failover sans crm/pacemaker +[[Image(heartbeat_simple.png, 33%)]] + +Dans un premier temps il faut définir les nom d'hôtes dans /etc/hosts ou avoir un serveur DNS qui les résoud. +~~~ +192.168.0.1 ha-1 +192.168.0.2 ha-2 +~~~ + +Il faut ensuite authentifier les nœuds, en placant un md5 commun aux 2 dans /etc/ha.d/authkeys. Par exemple avec ` md5sum <<< 'un_mot_de_passe'` +~~~ +auth 1 +1 md5 12499c1b5fdbf25aa4abc05176904ca7 +~~~ +Ensuite il faut s'assurer que ce fichier ne soit lisible que par le root, pour cela on fait un chmod 600 sur le fichier authkeys. + +Puis, le fichier de configuration, le plus simple possible : +Ici celui de ha-1. +~~~ +# +# keepalive: how many seconds between heartbeats +# +keepalive 2 +# +# deadtime: seconds-to-declare-host-dead +# +deadtime 10 +# +# What UDP port to use for udp or ppp-udp communication? +# +udpport 694 +bcast eth0 +mcast eth0 225.0.0.1 694 1 0 +ucast eth0 192.168.0.2 +# What interfaces to heartbeat over? +udp eth0 +# +# Tell what machines are in the cluster +# node nodename ... -- must match uname -n +node ha-1 +node ha-2 +~~~ +Sur ha-2 il faut faire le même fichier de configuration mais remplacer la ligne `ucast eth0 192.168.0.2` par `ucast eth0 192.168.0.1` +Enfin, il faut indiquer le maître et l'adresse IP virtuelle que l'on veut utiliser, ainsi éventuellement qu'un service tel que apache2 dans le fichier `/etc/ha.d/haresources` +~~~ +ha-1 192.168.0.10 apache2 +~~~ +Puis démarrer le service sur les 2 machines `/etc/init.d/heartbeat start`[[BR]] + +On peut ensuite vérifier le bon fonctionnement avec juste un `ifconfig`[[BR]] + +Note : heartbeat utilise la méthode des `gratuitous arp` quand le maître est _down_, l'esclave indique que l'adresse IP virtuelle n'est plus associé à l'adresse MAC connu par le client, mais l'adresse MAC de l'esclave, celui-ci remet donc son cache à jour. + +Si l'on souhaite que le master ne reprenne pas la main s'il est à nouveau up après un down, il faut mettre `auto_failback off` dans `ha.cf` + +### Mettre en place un failover avec crm/pacemaker et apache en service +Pour utiliser _crm_ il faut l'activer dans le `ha.cf` en mettant ` crm yes `[[BR]] + + +Il y a plusieurs façon de configurer crm : + +* Le shell crm, un outil en ligne de commande puissant, cachant la configuration de type xml, avec une aide en ligne et la complétion ; +* High availability web konsole, un interface web en AJAX. Encore en développement ; +* L'interface graphique heartbeat, typiquement un éditeur xml avancé avec des boutons pour définir des actions, et voir le status ; +* DRBD-MC, une console de management codé en Java, contient de nombreux assistants. + +On utilisera ici le shell crm avec des _templates_. + +~~~ +crm +cib new test +configure +template +list templates +~~~ +Les templates par défaut sont les suivants : + +~~~ +crm(live)configure template# list templates +virtual-ip ocfs2 gfs2 filesystem apache clvm +gfs2-base +~~~ + +On veut utiliser le template apache : +~~~ +new web apache +edit +~~~ + +Changer l'adresse IP virtuelle, l'id et le fichier de configuration apache. + +~~~ +ip 192.168.0.10 +id web-1 +configfile /etc/apache2/apache2.conf +~~~ + +Le fichier de template apache ressemble à ceci : + +~~~ +# Configuration: web + +# Edit instructions: +# +# Add content only at the end of lines starting with '%%'. +# Only add content, don't remove or replace anything. +# The parameters following '%required' are not optional, +# unlike those following '%optional'. +# You may also add comments for future reference. + +%name virtual-ip + +# Virtual IP address +# +# This template generates a single primitive resource of type IPaddr + +%pfx virtual-ip +%required + +# Specify an IP address +# (for example: 192.168.1.101) + +%% ip 192.168.0.10 + +%optional + +# If your network has a mask different from its class mask, then +# specify it here either in CIDR format or as a dotted quad +# (for example: 24 or 255.255.255.0) + +%% netmask + +# Need LVS support? Set this to true then. + +%% lvs_support + +%name apache + +# Apache web server +# +# This template generates a single primitive resource of type apache + +%depends_on virtual-ip +%suggests filesystem + +# NB: +# The apache RA monitor operation requires the status module to +# be loaded and access to its page (/server-status) allowed from +# localhost (127.0.0.1). Typically, the status module is not +# loaded by default. How to enable it depends on your +# distribution. For instance, on recent openSUSE or SLES +# releases, it is enough to add word "status" to the list in +# variable APACHE_MODULES in file /etc/sysconfig/apache2. + +%pfx apache +%required + +# Name the apache resource +# (for example: web-1) + +%% id web-1 + +# The full pathname of the Apache configuration file + +%% configfile /etc/apache2/apache2.conf + +%optional + +# Extra options to apply when starting apache. See man + +%% options + +# Files (one or more) which contain extra environment variables, +# such as /etc/apache2/envvars + +%% envfiles + +# Don't edit anything below this line. + +%generate + +primitive virtual-ip ocf:heartbeat:IPaddr + params ip=%virtual-ip:ip + opt cidr_netmask=%virtual-ip:netmask + opt lvs_support=%virtual-ip:lvs_support + + +primitive apache ocf:heartbeat:apache + params configfile=%apache:configfile + opt options=%apache:options + opt envfiles=%apache:envfiles + +monitor apache 120s:60s + +group %apache:id + apache virtual-ip + +~~~ + +~~~ +show +apply +cd .. +show +commit +~~~ + +~~~ +location web-1-pref web-1 100: ha-1 +property stonith-enabled=false +commit +^d +~~~ +Il faut ensuite attendre que la configuration se propage sur le deuxième nœud. +### Divers + +En clonant des machines virtuelles, Heartbeat garde le même uuid qu'il a généré auparavant, ce qui pose quelques soucis, car il ne sait plus qui est qui ... et dans le doute il reboot ! +Pour re-générer les uuid, il faut supprimer le fichier /var/lib/heartbeat/hb_uuid +Logs : +~~~ +root@ha-2:~# grep -B 10 Reboot /var/log/syslog +May 9 11:24:18 client cib: [1923]: info: register_heartbeat_conn: Hostname: ha-2 +May 9 11:24:18 client cib: [1923]: info: register_heartbeat_conn: UUID: 66a8d84d-3fc6-402e-aa46-d433a1d5281b +May 9 11:24:18 client cib: [1923]: info: ccm_connect: Registering with CCM... +May 9 11:24:18 client cib: [1923]: WARN: ccm_connect: CCM Activation failed +May 9 11:24:18 client cib: [1923]: WARN: ccm_connect: CCM Connection failed 1 times (30 max) +May 9 11:24:18 client heartbeat: [1887]: WARN: nodename ha-1 uuid changed to ha-2 +May 9 11:24:18 client heartbeat: [1887]: debug: displaying uuid table +May 9 11:24:18 client heartbeat: [1887]: debug: uuid=66a8d84d-3fc6-402e-aa46-d433a1d5281b, name=ha-1 +May 9 11:24:18 client heartbeat: [1887]: WARN: Managed /usr/lib/heartbeat/ccm process 1922 killed by signal 11 [SIGSEGV - Segmentation violation]. +May 9 11:24:18 client heartbeat: [1887]: ERROR: Managed /usr/lib/heartbeat/ccm process 1922 dumped core +May 9 11:24:18 client heartbeat: [1887]: EMERG: Rebooting system. Reason: /usr/lib/heartbeat/ccm +~~~ diff --git a/HowtoHtop.md b/HowtoHtop.md new file mode 100644 index 00000000..0d4f6cba --- /dev/null +++ b/HowtoHtop.md @@ -0,0 +1,18 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowtoHtop + +## Voir les I/O + +Htop depuis la version fourni dans squeeze dispose de sondes permettant d'identifier les écriture, lecture et performance sur les I/O. + +On peut l'activer via le menu : + +F2-->Columns-->Available Columns --> Ajouter les IO_* (F5, attention ils sont tout en bas de la liste !) + +Sinon voici un .htoprc qui contient les colonnes avec les sondes d'I/O + +~~~ +fields=0 48 17 18 38 39 40 2 46 47 62 63 64 49 1 +~~~ +62 63 64 concernent les colonnes pour les sondes d'I/O. \ No newline at end of file diff --git a/HowtoIPMI.md b/HowtoIPMI.md new file mode 100644 index 00000000..fbe14a4d --- /dev/null +++ b/HowtoIPMI.md @@ -0,0 +1,185 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto IPMI + + + + +modprobe ipmi_si +modprobe ipmi_devintf + +ipmi message handler version 39.1 +IPMI System Interface driver. +ipmi_si: Trying SMBIOS-specified kcs state machine at i/o address 0xca8, slave address 0x20, irq 0 +ipmi: Found new BMC (man_id: 0x0002a2, prod_id: 0x0000, dev_id: 0x20) + IPMI kcs interface initialized +ipmi device interface + + + + +aptitude install openipmi +aptitude install ipmitool + +cat /proc/devices | grep ipmi +NNN ipmidev + +mknod -m 0600 /dev/ipmi0 c NNN 0 + +ipmitool lan print +ipmitool sensor +ipmitool sdr + + +over LAN : + +usage: lan set [option] + +LAN set commands: + ipaddr Set channel IP address + netmask Set channel IP netmask + macaddr Set channel MAC address + defgw ipaddr Set default gateway IP address + defgw macaddr Set default gateway MAC address + bakgw ipaddr Set backup gateway IP address + bakgw macaddr Set backup gateway MAC address + password Set session password for this channel + snmp Set SNMP public community string + user Enable default user for this channel + access Enable or disable access to this channel + arp response Enable or disable BMC ARP responding + arp generate Enable or disable BMC gratuitous ARP generation + arp interval Set gratuitous ARP generation interval + auth Set channel authentication types + level = CALLBACK, USER, OPERATOR, ADMIN + type = NONE, MD2, MD5, PASSWORD, OEM + ipsrc Set IP Address source + none = unspecified source + static = address manually configured to be static + dhcp = address obtained by BMC running DHCP + bios = address loaded by BIOS or system software + cipher_privs XXXXXXXXXXXXXXX Set RMCP+ cipher suite privilege levels + X = Cipher Suite Unused + c = CALLBACK + u = USER + o = OPERATOR + a = ADMIN + O = OEM + +# ipmitool -I open lan set 1 "ipsrc" "static" + +# ipmitool lan print 1 +Set in Progress : Set In Progress +Auth Type Support : NONE MD2 MD5 PASSWORD +Auth Type Enable : Callback : MD2 MD5 + : User : MD2 MD5 + : Operator : MD2 MD5 + : Admin : MD2 MD5 + : OEM : MD2 MD5 +IP Address Source : Static Address +IP Address : 0.0.0.0 +Subnet Mask : 0.0.0.0 +MAC Address : 00:13:72:50:42:42 +SNMP Community String : public +IP Header : TTL=0x40 Flags=0x40 Precedence=0x00 TOS=0x10 + +=> interface Ethernet spécifique + + + +% ipmitool -I lan -H 1.2.3.169 -U root shell + + +bootdev [clear-cmos=yes|no] + none : Do not change boot device order + pxe : Force PXE boot + disk : Force boot from default Hard-drive + safe : Force boot from default Hard-drive, request Safe Mode + diag : Force boot from Diagnostic Partition + cdrom : Force boot from CD/DVD + bios : Force boot into BIOS Setup + +power : +cycle,reset = reboot +off,soft = extinction +on = demarrage + +ipmitool shell + +ipmitool> power status +Chassis Power is on +ipmitool> power cycle +Chassis Power Control: Cycle + +ipmitool> user list +ID Name Callin Link Auth IPMI Msg Channel Priv Limit +2 root true true true ADMINISTRATOR + +ipmitool> session info all +session handle : 32 +slot count : 5 +active sessions : 1 +user id : 2 +privilege level : ADMINISTRATOR +session type : IPMIv1.5 +channel number : 0x01 +console ip : 1.2.3.4 +console mac : 00:16:17:52:fa:87 +console port : 33594 + +ipmitool> sel list + + 7 | Pre-Init Time-stamp | Power Supply #0x65 | Power Supply AC lost | Asserted + 8 | Pre-Init Time-stamp | Power Supply #0x74 | Redundancy Lost + 9 | 08/17/2007 | 15:46:15 | Power Supply #0x65 | Failure detected | Deasserted + a | 08/17/2007 | 15:46:16 | Power Supply #0x65 | Power Supply AC lost | Deasserted + b | 08/17/2007 | 15:46:16 | Power Supply #0x74 | Fully Redundant + c | 08/17/2007 | 15:46:35 | Memory #0x53 | Correctable ECC | Asserted + d | 08/17/2007 | 15:46:42 | Temperature #0x30 | Upper Critical going high + e | 08/17/2007 | 15:46:46 | Temperature #0x30 | Upper Critical going high + f | 08/17/2007 | 15:46:49 | Voltage #0x60 | Lower Critical going low + + +modprobe ipmi_watchdog + +IPMI Watchdog: driver initialized +Copyright (C) 2004 MontaVista Software - IPMI Powerdown via sys_reboot. + +modprobe ipmi_poweroff + +IPMI poweroff: ATCA Detect mfg 0x2A2 prod 0x100 +IPMI poweroff: Found a chassis style poweroff function + +IP : +---- + +ipmitool> lan set 1 ipaddr 1.2.3.33 +Setting LAN IP Address to 1.2.3.33 +ipmitool> lan set 1 netmask 255.255.255.0 +Setting LAN Subnet Mask to 255.255.255.0 + +ipmitool> lan print 1 + +ipmitool> lan set 1 access on + +Users : +------- + +ipmitool> user set password 2 +ipmitool> user test 2 16 +Success +ipmitool> user test 2 16 +Set User Password command failed (user 2): Unknown (0x80) +Failure: password incorrect + + +En réseau : +=========== + + +% ipmitool -I lan -H 1.2.3.169 -U root shell + +OpenBSD : +========= + +# sysctl hw.sensors \ No newline at end of file diff --git a/HowtoIPTables.md b/HowtoIPTables.md new file mode 100644 index 00000000..c7485906 --- /dev/null +++ b/HowtoIPTables.md @@ -0,0 +1,47 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto IPTables + + + +_netfilter_ est la couche de firewalling sous Linux, gérable via la commande *iptables*. + +## Firewall sur un serveur + +Sur un serveur, nous gérons le firewall avec le script *minifirewall*. + +### minifirewall + + + +Cela s'installe ainsi : + +~~~ +# [ -e /etc/firewall.rc ] && cp /etc/firewall.rc /etc/firewall.rc.bak +# cd /etc && wget " -O firewall.rc +# cd /etc/init.d && wget " -O minifirewall +# chmod 700 /etc/init.d/minifirewall +# chmod 600 /etc/firewall.rc +~~~ + +On peut ensuite gérer les règles via le fichier _/etc/firewall.rc_ et on peut ainsi : + +~~~ +# /etc/init.d/minifirewall restart +# /etc/init.d/minifirewall stop +~~~ + +### Divers + +En cas de besoin de bannir temporairement une adresse IP : + +~~~ +# iptables -I INPUT -s IP_PIRATE -j DROP +~~~ + +## NAT bidirectionnel + +~~~ +# iptables -t nat -A PREROUTING -i eth0 -d IP_publique -j DNAT --to-destination 10.1.2.3 +# iptables -t nat -A POSTROUTING -o eth0 -s 10.1.2.3 -j SNAT --to-source IP_publique +~~~ diff --git a/HowtoISAKMPD.md b/HowtoISAKMPD.md new file mode 100644 index 00000000..4b9f49ac --- /dev/null +++ b/HowtoISAKMPD.md @@ -0,0 +1,231 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto VPN IPsec sous OpenBSD + +Il existe deux méthodes pour mettre en place un VPN IPsec sous OpenBSD. La première est de créer un fichier de configuration /etc/isakmpd/isakmpd.conf. La seconde est d'utiliser /etc/ipsec.conf et sa syntaxe "pf-like" et de laisser ipsecctl s'occuper des politiques de flux et de l'établissement de la SA (Security association). + +## Méthode isakmpd via isakmpd.conf + +### Recharger isakmpd + +Pour recharger la configuration d'ISAKMPD, il suffit de lui envoyer un SIGHUP. +Ceci ne provoque pas coupure VPN pour les phases 1 (IPSEC) mais un rechargement de +toutes les phases 2 ! + +~~~ +pkill -HUP isakmpd +~~~ + +Note : attention, on a déjà constaté un plantage peu après un rechargement. +Il conviendra de surveiller attentivement qu'ISAKMPD tourne bien. + +### Redémarrer isakmpd + +Attention cela interrompt tous les VPN pendant quelques instants. + +~~~ +pkill isakmpd +isakmpd -v +~~~ + +### Consulter les logs + +~~~ +tail -f /var/log/messages | grep isakmpd +~~~ + +### Voir les routes + +~~~ +route -n show +~~~ + +Si isakmpd est bien lancé, une section Encap: doit apparaître. + +### Voir les associations VPN + +~~~ +ipsecctl -s a +~~~ + +### Envoyer des commandes au daemon + +Cela se fait en écrivant dans le fichier fifo /var/run/isakmpd.fifo. + +La liste des commandes est disponible dans la page de man. + +Exemple pour obtenir un rapport de l'état interne du daemon : + +~~~ +# echo r >/var/run/isakmpd.fifo +# cat /var/run/isakmpd.result +~~~ + +Pour avoir l'état de tous les VPNs : + +~~~ +# echo S >/var/run/isakmpd.fifo +# cat /var/run/isakmpd.result +~~~ + +Pour recharger les VPNs (équivalent au pkill -HUP) : + +~~~ +# echo R >/var/run/isakmpd.fifo +~~~ + +Pour stopper proprement le démon : + +~~~ +# echo Q >/var/run/isakmpd.fifo +~~~ + +Pour stopper un VPN (phase 1 ou 2) : + +~~~ +# echo "t main peer-XXXX" >/var/run/isakmpd.fifo +# echo "t quick XXXX" >/var/run/isakmpd.fifo +~~~ + +Pour relance un VPN (phase 1 ou 2... ce n'est pas clair. cela semble fonctionner pour la phase 1... à voir pour la phase 2). + +~~~ +# echo "c XXXX" >/var/run/isakmpd.fifo +~~~ + + +*Note générale : attention, il peut un avoir un délai dans l'exécution des commandes* + +### FAQ + +Que veulent dire les messages suivants ? + +~~~ +isakmpd[7864]: dpd_handle_notify: bad R_U_THERE seqno 551411465 <= 2374875689 +~~~ + +C'est un message relatif au DPD (Dead peer detection) qui est un mécanisme pour détecter des éventuels soucis avec VPN. +Voir + +~~~ +isakmpd[7864]: attribute_unacceptable: AUTHENTICATION_METHOD: got PRE_SHARED, expected RSA_SIG +isakmpd[7864]: message_negotiate_sa: no compatible proposal found +isakmpd[7864]: dropped message from 192.0.2.1 port 500 due to notification type NO_PROPOSAL_CHOSEN +~~~ + +Il s'agit d'un routeur VPN distant qui essaye de se connecter, mais n'a pas de configuration correspondante. +Cela peut se produire typiquement si son adresse IP change, et qu'elle n'est plus présente dans la configuration d'ISAKMPD. + +~~~ +isakmpd[10418]: isakmpd: phase 1 done (as responder): initiator id 192.0.2.1, responder id 1.2.3.4, src: 1.2.3.4 dst: 192.0.2.1 +isakmpd[10418]: dropped message from 192.0.2.1 port 500 due to notification type INVALID_ID_INFORMATION +isakmpd[10418]: message_validate_notify: protocol not supported +~~~ + +Cela signifie a priori que la configuration en face à un réseau "remote" incorrect (soit complètement faux, soit pas sous la forme ADRESSE RÉSEAU / MASQUE) + +Voir + +### Debuger + +~~~ +# isakmpd -L -v -DA=90 +# tcpdump -n -vs 1440 -r /var/run/isakmpd.pcap +~~~ + +## Méthode isakmpd via ipsec.conf + +### Mise en place d'un VPN "simple" entre 2 machines OpenBSD + +On dispose de : + +* 2 passerelles VPN OpenBSD gw1 et gw2 (192.0.2.254 et 198.51.100.254) +* 2 LAN net1 et net2 correspondants (192.0.2.0/24 et 198.51.100.0/24) + +Sur gw1 : + +Vérifier que les sysctl suivants sont actifs : + +~~~ +# sysctl net.inet.esp.enable +net.inet.esp.enable=1 +# sysctl net.inet.ah.enable +net.inet.ah.enable=1 +# sysctl net.inet.ip.forwarding +net.inet.ip.forwarding: 1 -> 1 +~~~ + +Activer l'interface enc0 : + +~~~ +# ifconfig enc0 up +# echo up >/etc/hostname.enc0 +~~~ + +Dans /etc/pf.conf, positionner : + +~~~ +set skip on {lo0 enc0} + +pass in on $ext_if proto esp from $addr_gw2 to ($ext_if) +pass in on $ext_if proto udp from $addr_gw2 to ($ext_if) port {isakmp, ipsec-nat-t} +~~~ + +Dans /etc/ipsec.conf, positionner : + +~~~ +local_ip="192.0.2.254" +local_network="192.0.2.0/24" +remote_ip="198.51.100.254" +remote_network="198.51.100.0/24" + +ike passive esp from $local_network to $remote_network peer $remote_ip +ike passive esp from $local_ip to $remote_network peer $remote_ip +ike passive esp from $local_ip to $remote_ip +~~~ + +Récupérer la clé pré-générée de l'autre passerelle : + +~~~ +# scp gw2:/etc/isakmpd/local.pub /etc/isakmpd/pubkeys/ipv4/198.51.100.254 +~~~ + +Tester la configuration : + +~~~ +# ipsecctl -n -f /etc/ipsec.conf +~~~ + +Démarrer le service : + +~~~ +# isakmpd -K +# ipsecctl -f /etc/ipsec.conf +~~~ + +Puis effectuer les mêmes actions sur l'autre passerelle. + +On doit alors pouvoir pinger chaque réseau à partir de l'autre passerelle ou de l'autre réseau. + +Pour relancer un VPN il suffit de récupérer le nom des variables isakmpd générées par ipsectl via la commande suivante puis d'utiliser la même méthode qu'avec isakmpd. + +~~~ +# ipsecctl -nvf /etc/ipsec.conf +~~~ + +### Debug IPsec + +Eteindre isakmpd : +~~~ +# /etc/rc.d/isakmpd stop +~~~ +Dans une console : +~~~ +# isakmpd -d -DA=90 -K +~~~ +Dans une autre console : +~~~ +# ipsecctl -f /etc/ipsec.conf +~~~ + + diff --git a/HowtoISCSI.md b/HowtoISCSI.md new file mode 100644 index 00000000..5b540d3c --- /dev/null +++ b/HowtoISCSI.md @@ -0,0 +1,346 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto iSCSI + + + +Vocabulaire : l'initiator est le client iSCSI, le target est le serveur iSCSI. + +## Installation d'un initiator + +Sous Debian, l'utilitaire pour avoir un initiator iSCSI est fourni avec le paquet _open-isci_. + +~~~ +# aptitude install open-iscsi +~~~ + +S'assurer que _iscsid_ est bien démarré : + +~~~ +# /etc/init.d/open-iscsi start +~~~ + +Scanner les devices disponibles : + +~~~ +# iscsiadm -m discovery -t sendtargets -p IP_ADDRESS +~~~ + +### Configuration simple + +Une configuration simple est lorsque vous avez une liaison iSCSI via une seule interface Ethernet. + +Exemple pour attacher le device iSCSI : + +~~~ +# iscsiadm --mode node --targetname qn.2002-10.com.infortrend:raid.sn8128457.001 --portal IP_ADDRESS:3260 --login +Logging in to [iface: default, target: iqn.2002-10.com.infortrend:raid.sn8128457.001, portal: IP_ADDRESS,3260] +Login to [iface: default, target: iqn.2002-10.com.infortrend:raid.sn8128457.001, portal: IP_ADDRESS,3260]: successful +~~~ + +Un dmesg nous confirme que le device iSCSI est attaché : + +~~~ +[589633.268035] Loading iSCSI transport class v2.0-870. +[589634.206569] iscsi: registered transport (tcp) +[589634.533062] iscsi: registered transport (iser) +[590317.751042] scsi2 : iSCSI Initiator over TCP/IP +[590318.406292] scsi 2:0:0:0: Direct-Access IFT DS S12E-G2140-4 386C PQ: 0 ANSI: 5 +[590318.500371] scsi 2:0:0:0: Attached scsi generic sg1 type 0 +[590318.502537] scsi 2:0:0:1: Enclosure IFT DS S12E-G2140-4 386C PQ: 0 ANSI: 4 +[590318.502613] scsi 2:0:0:1: Attached scsi generic sg2 type 13 +[590318.568943] sd 2:0:0:0: [sda] 19528073216 512-byte logical blocks: (9.99 TB/9.09 TiB) +[590318.598211] sd 2:0:0:0: [sda] Write Protect is off +[590318.598214] sd 2:0:0:0: [sda] Mode Sense: 83 00 00 08 +[590318.599120] sd 2:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or + FUA +[590318.664632] sda: unknown partition table +[590318.703094] sd 2:0:0:0: [sda] Attached SCSI disk +[590318.725349] ses 2:0:0:1: Attached Enclosure device +~~~ + +### Gestion des volumes + +Pour lister les sessions iSCSI ouvertes : +~~~ +# iscsiadm -m session +~~~ + +Pour se déconnecter proprement d'un target (après avoir démonté les disques) : +~~~ +# iscsiadm -m node -u +~~~ + +Pour déconnecter un seul LUN d'un target : +~~~ +# iscsiadm -m node –op=delete -T +# iscsiadm -m node –login -T [iqn du LUN] +~~~ + +## Montage au démarrage + +Une fois la configuration testée et validée, il est souhaitable que les volumes iSCSI soient montés automatiquement au démarrage du serveur. + +### Connexion aux LUNs + +Lorsqu'on lance la détection des volumes d'un target, ou que l'on se connecte à ce dernier, la commande _iscsiadm_ créée des fichiers de configuration dans /etc/iscsi/nodes et /etc/iscsi/send_targets. +Ces fichiers sont relativement simples à comprendre, mais une option nous intéresse plus particulièrement : + +Dans le répertoire /etc/iscsi/nodes sont stockés les nodes auxquels nous nous sommes déjà connecté sous la forme : +~~~ +[iqn]/[ip],[port],1/default +~~~ + +Par exemple, pour un SAN MD3600i en multipath nous avons : +~~~ +# ls -l /etc/iscsi/nodes/iqn.1984-05.com.dell\:powervault.md3600i.36782bcb00050034200000xxxxxxxxxx/ +drw------- 2 root root 4096 Oct 26 2011 192.168.130.101,3260,1 +drw------- 2 root root 4096 Oct 26 2011 192.168.131.101,3260,1 +~~~ + +Pour se connecter automatiquement aux LUNs au démarrage du serveur, il faut modifier la directive "node.startup" en la passant de "manual" à "automatic" : +~~~ +# cat /etc/iscsi/nodes/iqn.1984-05.com.dell\:powervault.md3600i.36782bcb00050034200000xxxxxxxxxx/192.168.130.101\,3260\,1 +node.name = iqn.1984-05.com.dell:powervault.md3600i.36782bcb00050034200000xxxxxxxxxx +node.tpgt = 1 +node.startup = automatic +iface.iscsi_ifacename = default +iface.transport_name = tcp +node.discovery_address = 192.168.130.101 +node.discovery_port = 3260 +node.discovery_type = send_targets +[...] +~~~ + +### /etc/fstab + +Lorsque les partition d'un device iSCSI sont ajoutées au fichier fstab, ne pas oublier l'option "_netdev": elle permet non seulement d'attendre que le réseau soit actif avant de chercher à monter la partition (pour ne pas bloquer le démarrage du serveur, ce serait dommage...) mais aussi de démonter la/les partitions à l'extinction de la machine avant de couper le réseau afin d'éviter toute corruption du filesystem (encore une fois, ce serait dommage). + +~~~ +/dev/mapper/data /home ext3 _netdev,defaults,noexec,nosuid,nodev 0 0 +~~~ + +### Configuration avec deux interfaces et deux liaisons indépendantes vers un target + +Vous configurez vos 2 interfaces sur une plage réseau différente. Vous pouvez ainsi +scanner le target sur 2 IPs complètement distinctes : + +~~~ +# iscsiadm -m discovery -t sendtargets -p IP_ADDRESS1 +# iscsiadm -m discovery -t sendtargets -p IP_ADDRESS2 +~~~ + +Puis attacher les devices deux fois indépendamment : + +~~~ +# iscsiadm --mode node --targetname qn.2002-10.com.infortrend:raid.sn8128457.001 --portal IP_ADDRESS1:3260 --login +# iscsiadm --mode node --targetname qn.2002-10.com.infortrend:raid.sn8128457.001 --portal IP_ADDRESS2:3260 --login +~~~ + +Vous pouvez ainsi accéder au target via plusieurs devices ! Pour gérer du multipath, voir ci-dessous. + +### Configuration avec deux interfaces et liaison unique vers un target + +Si vous êtes connectés avec d'autres initiator iSCSI (c'est souvent le cas), vous +serez sûrement connectés sur un switch dédié au iSCSI. Le target qui a en général +plusieurs interfaces Ethernet aura probablement des adresses IP sur la même plage. +Vous allez donc configurer vos deux interfaces avec des IPs sur la même plage : + +~~~ +# ifconfig eth2 10.0.0.100/24 +# ifconfig eth3 10.0.0.101/24 +~~~ + +Il faut alors créer des interfaces iSCSI pour chaque carte réseau : + +~~~ +# iscsiadm --mode iface --op=new --interface iscsi-0 +New interface iscsi-0 added +# iscsiadm --mode iface --op=new --interface iscsi-1 +New interface iscsi-1 added +# iscsiadm --mode iface --op=update --interface iscsi-0 --name=iface.net_ifacename --value=eth2 +iscsi-0 updated. +# iscsiadm --mode iface --op=update --interface iscsi-1 --name=iface.net_ifacename --value=eth3 +iscsi-1 updated. +# iscsiadm --mode iface +default tcp,,,, +iser iser,,,, +iscsi-0 tcp,,,eth2, +iscsi-1 tcp,,,eth3, +# iscsiadm --mode iface --interface iscsi-0 +# BEGIN RECORD 2.0-871 +iface.iscsi_ifacename = iscsi-0 +iface.net_ifacename = eth2 +iface.ipaddress = +iface.hwaddress = +iface.transport_name = tcp +iface.initiatorname = +# END RECORD +# iscsiadm --mode iface --interface iscsi-1 +# BEGIN RECORD 2.0-871 +iface.iscsi_ifacename = iscsi-1 +iface.net_ifacename = eth3 +iface.ipaddress = +iface.hwaddress = +iface.transport_name = tcp +iface.initiatorname = +# END RECORD +~~~ + +Puis attacher les devices deux fois via chaque interface iSCSI : + +~~~ +# iscsiadm --mode node --targetname qn.2002-10.com.infortrend:raid.sn8128457.001 --portal IP_ADDRESS:3260 -I iscsi-0--login +# iscsiadm --mode node --targetname qn.2002-10.com.infortrend:raid.sn8128457.001 --portal IP_ADDRESS:3260 -I iscsi-1 --login +~~~ + +On obtient donc plusieurs périphériques identiques. Pour gérer du multipath, voir ci-dessous. + +## Multipath + +ATTENTION, HOWTO EN COURS DE CONSTRUCTION... + +Lorsque l'on a plusieurs paths vers un device (voir ci-dessus), l'idée est de +profiter de cela pour avoir une tolérance de panne et une agrégation des débits. + +### Utilisation du multipath + +~~~ +aptitude install multipath-tools +modprobe dm_multipath +~~~ + +On peut voir les différents chemins pour accèder à un même périphérique : + +~~~ +# multipath -ll +3600d0231000b3f9e55030d29266ffe95 dm-2 IFT,DS S12E-G2140-4 +size=1.8T features='0' hwhandler='0' wp=rw +|-+- policy='round-robin 0' prio=1 status=active +| `- 7:0:0:0 sdd 8:48 active ready running +`-+- policy='round-robin 0' prio=1 status=enabled + `- 8:0:0:0 sdg 8:96 active ready running +3600d0231000b3f9e6075561c390db5ce dm-4 IFT,DS S12E-G2140-4 +size=836G features='0' hwhandler='0' wp=rw +|-+- policy='round-robin 0' prio=1 status=active +| `- 7:0:0:2 sdf 8:80 active ready running +`-+- policy='round-robin 0' prio=1 status=enabled + `- 8:0:0:2 sdi 8:128 active ready running +3600d0231000b3f9e68e8e32f513c36b5 dm-3 IFT,DS S12E-G2140-4 +size=3.6T features='0' hwhandler='0' wp=rw +|-+- policy='round-robin 0' prio=1 status=active +| `- 7:0:0:1 sde 8:64 active ready running +`-+- policy='round-robin 0' prio=1 status=enabled + `- 8:0:0:1 sdh 8:112 active ready running +~~~ + +On doit ensuite configurer _multipathd_ via +un fichier */etc/multipath.conf*. Voici un exemple (utilisé +avec un SAN DELL MD3600i) : + +~~~ +defaults { + udev_dir /dev + polling_interval 5 + user_friendly_names yes +} + +# Blacklist tous les devices +devnode_blacklist { + devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*" + devnode "^hd[a-z][[0-9]*]" + devnode "^sd[a-z][[0-9]*]" + devnode "^cciss!c[0-9]d[0-9]*[p[0-9]*]" +} + +# Définit les options de montage du multipath +devices { + device + { + vendor "DELL.*" + product "MD36xxi" + path_selector "round-robin 0" + # Agrège les débits + path_grouping_policy multibus + # Utilise le(s) lien(s) restant(s) au premier échec + failback immediate + no_path_retry fail + features "1 queue_if_no_path" + } +} + +# Identifie par son WWID le(s) disque(s) à utiliser en multipath +# Le disque sera disponible dans /dev/mapper/data +multipaths { + multipath { + wwid 36782bcb00050034200000xxxxxxxxxx + alias data + } +} + +~~~ + +On relance le daemon : + +~~~ +# /etc/init.d/multipath-tools restart +~~~ + +Et on vérifie : + +~~~ +# multipath -ll +data (36782bcb00050034200000xxxxxxxxxx) dm-0 DELL,MD36xxi +size=5.5T features='0' hwhandler='0' wp=rw +`-+- policy='round-robin 0' prio=2 status=active + |- 11:0:0:0 sde 8:64 active ready running + `- 10:0:0:0 sdf 8:80 active ready running +~~~ + +La politique multibus semble la plus intéressante car elle permet de gérer aussi bien le fail-over (en cas de perte d'un lien) que l'agrégation de débit. +L'option "failback immediate" indique de basculer sur le ou les lien(s) restant(s) dès qu'une erreur apparait, mais la bascule met 130s dans la configuration précédente, car c'est la couche SCSI qui remonte l'erreur à multipathd et le timeout par défaut d'open-iscsi est de 120 secondes. On peut régler la valeur de ce timeout dans le fichier /etc/iscsi/iscsid.conf pour les nouveaux targets, mais il ne faut pas oublier que les targets déjà configurés (même après déconnexion/reconnexion) conservent leurs paramètres dans /etc/iscsi/send_targets/[...], on modifiera donc également ces fichiers. + +Exemple avec notre baie Dell : +~~~ +# cat /etc/iscsi/nodes/iqn.1984-05.com.dell\:powervault.md3600i.36782bcb00050034200000xxxxxxxxxx/192.168.130.101\,3260\,1 +node.name = iqn.1984-05.com.dell:powervault.md3600i.36782bcb00050034200000xxxxxxxxxx +node.tpgt = 1 +node.startup = automatic +iface.iscsi_ifacename = default +iface.transport_name = tcp +node.discovery_address = 192.168.130.101 +node.discovery_port = 3260 +node.discovery_type = send_targets +[...] +node.session.timeo.replacement_timeout = 10 +~~~ + + +### Pour ne plus utiliser multipathd + +Commencer par démonter les partitions : +~~~ +# umount /dev/mapper/data +~~~ + +Stopper les utilitaires multipath : + +~~~ +# /etc/init.d/multipath-tools stop +~~~ + +Et purger la liste des différents paths pour la/les ressource(s) : +~~~ +# multipath -F +~~~ + +On peut vérifier : +~~~ +# multipath -ll +# +~~~ + +Éventuellement, on peut retirer les modules à présent inutilisés : +~~~ +# rmmod dm_round_robin dm_multipath +~~~ diff --git a/HowtoIcinga2.md b/HowtoIcinga2.md new file mode 100644 index 00000000..597dc56a --- /dev/null +++ b/HowtoIcinga2.md @@ -0,0 +1,356 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Icinga2 + +## Introduction + +Icinga2 est un logiciel de surveillance réseau qui vise à surveiller des services en place sur des serveurs. + +Icinga2 se veut un remplacement pour Icinga, un fork bien établit de Nagios. Contrairement à Icinga, qui reprenait une partie du code de Nagios et qui avait un système de configuration compatible, Icinga2 a été complètement réécrit et n'est pas compatible avec Nagios. + +## Structure + +Il existe plusieurs manières de déployer Icinga2 pour surveiller un ensemble de machines. Il est important avant de commencer la mise en place d'Icinga2 de bien réfléchir à la manière dont on souhaite monter notre système. Trois architectures différentes sont possibles: + +### Configuration locale + +Dans cette configuration, les machines locales sont configurées pour se surveiller elles-même et envoyer au serveur central les résultats ponctuellement. La configuration réside sur les machines locales et est synchronisée avec le serveur central. + +L'avantage de cette méthode est que les clients locaux peuvent écrire leurs configurations directement sans à avoir à passer par une gestion centralisée des tests et des configurations. + +Plus ["d'infos ici"](https://github.com/Icinga/icinga2/blob/master/doc/6-distributed-monitoring.md#-bottom-up-import). + +### Configuration en cluster + +Le principe de la configuration en cluster est semblable à celui de la configuration locale. La seule différence est que la configuration des machines locales est faite sur le serveur central. Lorsque l'on redémarre le daemon, le serveur central s'assure que les machines locales ont la bonne configuration. Plutôt d'aller « du bas vers le haut » on va donc « du haut vers le bas ». + +Cette méthode est idéale si l'on souhaite centraliser l'ensemble de notre configuration. + +Plus ["d'infos ici"](https://github.com/Icinga/icinga2/blob/master/doc/6-distributed-monitoring.md#-top-down-config-sync). + +### Pont d'exécution de commandes + +Avec la méthode du pont d'exécution de commandes, l'ensemble des configurations sont sur le serveur central et y restent. Il n'y a pas de synchronisation de configuration avec les machines locales. Quand le serveur central souhaite effectuer une test sur une machine locale, il la lance directement sur cette dernière. + +L'avantage de cette méthode est que les machines locales n'ont pas besoin d'avoir un daemon qui roule constamment pour effectuer les tests. Cela implique cependant que les machines locales doivent accepter des commandes directement du serveur central, ce qui est peut-être un peu moins sécuritaire. + +Plus ["d'infos ici"](https://github.com/Icinga/icinga2/blob/master/doc/6-distributed-monitoring.md#-top-down-command-endpoint). + +## Installation du master + +### Core + +L'installation du core d'`icinga2` sur le master est relativement simple. Cependant, la documentation disponible en ligne prends pour acquis que la version utilisée est celle disponible dans `jessie-backports`. Il faut donc s'assurer d'avoir la version 2.4 ou supérieure. + +~~~ +# apt -t jessie-backports install icinga2 icinga2-ido-mysql +~~~ + +Le package `icinga2-ido-mysql` fournit un assistant d'installation pour configurer une base de donnée MySQL automatiquement. Si on le souhaite, il est également possible de le faire manuellement. + +Une fois l'installation terminée, il est nécessaire d'activer `ido-mysql`: + +~~~ +# icinga2 feature enable ido-mysql +~~~ + +Pour finaliser l'installation d'`icinga2` en master, nous allons créer un CA et activer l'API. La commande qui suit lance un assistant d'installation. Mis à part la première option où il faut répondre `n`, les autres peuvent être laissées vides: + +~~~ +# icinga2 node wizard +~~~ + +On s'assure finalement que l'ensemble des options voulues sont bien activées en redémarrant le daemon: + +~~~ +# service icinga2 restart +~~~ + +### WebUI + +Pour fonctionner, le WebUI a besoin d'un serveur web et d'un serveur de base de donnée. Dans les exemples qui suivent, nous utiliseront [/HowtoLAMP/Apache Apache] et [/HowtoLAMP/MySQL MySQL]. + +Malheureusement, la version 2 du WebUI d'`icinga2` n'est pas dans Debian jessie à l'heure actuelle. Il est donc nécessaire soit d'utiliser les packages fournis par Icinga, ou alors d'utiliser la version dans Stretch. + +Pour Stretch, il suffit de modifier `/etc/apt/sources.list` et de s'assurer d'avoir un fichier `/etc/apt/preferences` qui ressemble au suivant: + +~~~ +Explanation: Debian jessie +Package: * +Pin: release o=Debian,n=jessie +Pin-Priority: 990 + +Explanation: Debian stretch +Package: * +Pin: release o=Debian,n=stretch +Pin-Priority: 2 +~~~ + +Une fois que cela est fait, on met à jour ses sources et on installe les packages nécessaires: + +~~~ +# apt update +# apt install icingaweb2 +~~~ + +Il est possible de rouler des commande à partir du WebUI directement. Pour cela, il faut ajouter le user qui roule le WebUI dans Apache au groupe `nagios`. Avec `apache2-mpm-itk`, cette étape devrait être superflue car le WebUI devrait déjà rouler sous le user `nagios`: + +~~~ +# addgroup --system www-data nagios +# icinga2 feature enable command +# service icinga2 restart +~~~ + +On ajoute maintenant un VHost apache dans `/etc/apache2/sites-available/icinga2.conf`: + +~~~ + + + ServerName fqdn.org + DocumentRoot /usr/share/icingaweb2/public + + + Options SymLinksIfOwnerMatch + AllowOverride None + + + Require all granted + + + SetEnv ICINGAWEB_CONFIGDIR "/etc/icingaweb2" + + EnableSendfile Off + + + RewriteEngine on + RewriteBase / + RewriteCond %{REQUEST_FILENAME} -s [OR] + RewriteCond %{REQUEST_FILENAME} -l [OR] + RewriteCond %{REQUEST_FILENAME} -d + RewriteRule ^.*$ - [NC,L] + RewriteRule ^.*$ index.php [NC,L] + + + + DirectoryIndex error_norewrite.html + ErrorDocument 404 /error_norewrite.html + + + +~~~ + +On active ensuite le VHost et on redémarre apache: + +~~~ +# a2ensite icinga2.conf +# service apache2 reload +~~~ + +Pour continuer l'installation du WebUI, on visite le L'installeur va nous demander un token. On peut créer ce token avec la commande suivante: + +~~~ +# icingacli setup token create +~~~ + +La prochaine étape de l'assistant vous demande quelles fonctions activer. Il est recommandé de choisir `Doc` et `Monitoring`. + +L'assistant lance ensuite une série de tests. Il est important de s'assurer que tous les tests sont OK. Il est normal que les tests PostgreSQL s'affichent en jaune, car on utilise MySQL. + +Icingaweb2 offre plusieurs backends d'authentification. Pour une grande organisation, il est préférable d'utiliser le backend LDAP. Pour quelques comptes, il est cependant plus simple d'utiliser le backend basé sur une base de donnée. + +Si l'on choisi un backend base de donnée, il suffit de renter les informations d'authentification que l'on souhaite avoir. Le WebUI va ensuite nous aviser que la base de donnée n'existe pas encore et nous demander le mot de passe root pour en créer une pour nous. Encore une fois, il est possible de faire cela directement en ligne de commande avec MySQL. + +Après avoir finalisé les informations pour l'authentification, il vous faudra donner au WebUI l'accès à la base de donnée créée précédemment pour icinga2. Les informations d'authentification se trouvent dans `/etc/icinga2/features-available/ido-mysql.conf`. + +Et voilà! Votre WebUI devrait être en place et vous devriez pouvoir vous connecter au + +## Installation du client + +### Configuration du lien master-client + +Par défaut, quand on installe `icinga2` sur une machine, le daemon est lancé et `icinga2` se met à surveiller le `localhost`. Pour cette documentation, nous allons monter une architecture de surveillance de type [#Configurationencluster "configuration en cluster"]. Cela va nous permettre de pouvoir centraliser la configuration à un seul endroit et de la gérer à travers Git. + +Attention! La seule commande `icinga2 node ` que l'on devrait rouler avec ce type de configuration est `icinga2 node wizard` au tout début du processus d'installation. + +Malgré les apparences, `icinga2 node update-config` ou encore `icinga2 node add` s'appliquent à une configuration de type locale. Il ne faut donc pas les utiliser en cluster! + +On commence donc par installer `icinga2`: + +~~~ +# apt -t jessie-backports install icinga2 icinga2-ido-mysql +~~~ + +Une fois que cela est fait, on roule l'assistant de configuration: + +~~~ +# icinga2 node wizard +~~~ + +L'assistant nous pose plusieurs questions. On y répond de la manière suivante: + +~~~ +Please specify if this is a satellite setup ('n' installs a master setup) [Y/n]: y +Starting the Node setup routine... +Please specifiy the common name (CN) [icinga2-slave1]: +Please specify the master endpoint(s) this node should connect to: +Master Common Name (CN from your master setup): icinga2-master +Do you want to establish a connection to the master from this node? [Y/n]: y +Please fill out the master connection information: +Master endpoint host (Your master's IP address or FQDN): 192.168.4.229 +Master endpoint port [5665]: +Add more master endpoints? [y/N]: n +Please specify the master connection for CSR auto-signing (defaults to master endpoint host): +Host [192.168.4.229]: +Port [5665]: +warning/cli: Backup file '/etc/icinga2/pki/icinga2-slave1.key.orig' already exists. Skipping backup. +warning/cli: Backup file '/etc/icinga2/pki/icinga2-slave1.crt.orig' already exists. Skipping backup. +information/base: Writing private key to '/etc/icinga2/pki/icinga2-slave1.key'. +information/base: Writing X509 certificate to '/etc/icinga2/pki/icinga2-slave1.crt'. +information/cli: Fetching public certificate from master (192.168.4.229, 5665): + +Certificate information: + + Subject: CN = icinga2-master + Issuer: CN = Icinga CA + Valid From: Aug 15 21:03:54 2016 GMT + Valid Until: Aug 12 21:03:54 2031 GMT + Fingerprint: D6 6F 56 55 3B 73 16 45 D5 08 F6 FB CE A6 2A 14 F5 24 05 11 + +Is this information correct? [y/N]: y +information/cli: Received trusted master certificate. + +Please specify the request ticket generated on your Icinga 2 master. + (Hint: # icinga2 pki ticket --cn 'icinga2-slave1'): 4891c5c4c132908f2794d0ed347c9fbf204491aa +information/cli: Requesting certificate with ticket '4891c5c4c132908f2794d0ed347c9fbf204491aa'. + +warning/cli: Backup file '/etc/icinga2/pki/icinga2-slave1.crt.orig' already exists. Skipping backup. +information/cli: Writing signed certificate to file '/etc/icinga2/pki/icinga2-slave1.crt'. +information/cli: Writing CA certificate to file '/etc/icinga2/pki/ca.crt'. +Please specify the API bind host/port (optional): +Bind Host []: +Bind Port []: +Accept config from master? [y/N]: y +Accept commands from master? [y/N]: n +~~~ + +À noter qu'à l'étape où l'assistant demande le ticket généré sur le master, il faut rouler la commande suivante sur le master et copier l'output dans l'assistant: + +~~~ +icinga2 pki ticket --cn '' +~~~ + +Si client reconnaît maintenant le master, il est nécessaire de configurer le master pour qu'il reconnaisse le client. On va donc modifier le fichier `zones.conf` sur le master y ajouter la `zone` et le `endpoint` du nouveau client: + +~~~ +[...] + +object Endpoint "icinga2-slave1" { + host = "" +} + +object Zone "icinga2-slave1" { + endpoints = [ "icinga2-slave1" ] + parent = "master" +} +~~~ + +Et voilà! En théorie, le master et le client peuvent se parler! Comme nous n'avons pas encore configuré de test sur le nouveau client, il est normal qu'il n'apparaisse pas dans le WebUI. + +### Ajout de tests sur le client + +Avec le type de configuration que l'on a choisi, les fichiers de configuration sont modifiés sur le master, qui les synchronise sur le client. + +Nous allons donc ajouter nos tests sur le master dans `zones.d`, le dossier prévu à cet effet. On commence par y créer un nouveau dossier du nom du client que l'on souhaite configurer: + +~~~ +# mkdir /etc/icinga2/zones.d/icinga2-slave1 +~~~ + +Dans ce dossier, on crée un fichier nommé `hosts.conf` qui va nous servir à définir un nouvel objet de type `Host`. Cet objet va nous permettre par la suite de lier d'autres types d'objets à notre nouveau client: + +~~~ +object Host "icinga2-slave1" { + check_command = "hostalive" + address = "" + zone = "master" +} +~~~ + +On peut maintenant ajouter de nouveaux tests dans `services.conf`, des objets de type `Service`: + +~~~ +object Service "disk" { + host_name = "icinga2-slave1" + + check_command = "disk" +} + +object Service "ssh" { + host_name = "icinga2-slave1" + + check_command = "ssh" +} +~~~ + +Pour que la synchronisation se fasse entre le master et le client, on redémarre `icinga2` sur le master: + +~~~ +# service icinga2 reload +~~~ + +Si tout s'est passé correctement, vous devriez voir apparaître une nouvelle machine dans le WebUI, accompagné de trois nouveaux services, `ping4`, `disk` et `ssh`. + +## Fichiers de configuration + +Les fichiers de configuration se trouvent dans `/etc/icinga2`. Tous les fichiers de configuration utilisent la même syntaxe. Il existe d'ailleurs un plugin vim pour cette dernière: + +~~~ +# apt -t jessie-backports install vim-icinga2 +~~~ + +La configuration d'icinga2 se base principalement sur des objets de types différents. Par exemple, l'objet `Service` sert à définir un service à vérifier sur une machine, alors que l'objet `Host` définit un nouveau client. On peut retrouver une description détaillée de tous les objets [ici](http://docs.icinga.org/icinga2/latest/doc/module/icinga2/chapter/object-types). + +En général, l'emplacement des objets n'est pas réellement important. Dans l'exemple plus haut, on aurait ainsi pu ajouter l'objet `Host` dans le fichier `/etc/icinga2/zones.d/icinga2-slave1/mega_foobar.conf` au lieu de `/etc/icinga2/zones.d/icinga2-slave1/hosts.conf`. C'est cependant un bonne pratique de séparer clairement ses différents objets en fichiers nommés de manière claire. + +### init.conf + +Le premier fichier à être lu au démarrage du daemon. Il sert à définir sous quel groupe et quel user le daemon est lancé. + +### icinga2.conf + +Le fichier de configuration principal. Il sert surtout à définir les fichiers de configuration qui seront lus, comme `/features-enabled/*` par exemple. Ce fichier est le second à être lu au démarrage du daemon. + +### constants.conf + +Ce fichier regroupe les constantes globales d'Icinga2. On y trouve entre autres le Salt pour la génération de tokens et le nom de domaine du master (`NodeName`). + +### zones.conf + +Ce fichier sert à définir les relations entre le master et les clients, comme démontré dans l'exemple de configuration plus haut. + +### features-available + +Les fichiers dans ce dossier sont des plugins qui peuvent être activés avec les commandes suivantes: + +~~~ +# icinga2 feature enable +# service icinga2 reload +~~~ + +Une fois activés, il sont symlinkés dans `/features-enabled`, un peu comme pour Apache. + +### pki + +Ce dossier regroupe les fichiers du Public Key Infrastructure (PKI), qui servent de base d'authentification entre les clients et le master. Dans le cas du master, certains fichiers sont des duplicatas de fichiers dans `/var/lib/icinga2/ca/`. + +### scripts + +Ce dossier regroupe les différents scripts qui sont lancés lors d'un événement. Par exemple, c'est ici que l'on ajouterais de nouveaux scripts à être lancé pour des objets de type `EventCommand`. + +### conf.d + +Ce dossier regroupe les configurations de services sur le master et les configuration plus globales, comme les définitions de users et de groupes, ou encore les différents modes de surveillance (24h/7, 8 à 17h, etc.). + +### repository.d et zones.d + +`repository.d` regroupe les configurations des clients lors d'une synchronisation de type locale. À l'inverse, pour une configuration de type cluster, les fichiers se retrouveraient plutôt dans le dossier `zones.d`. \ No newline at end of file diff --git a/HowtoInitramfsDebug.md b/HowtoInitramfsDebug.md new file mode 100644 index 00000000..e64135e3 --- /dev/null +++ b/HowtoInitramfsDebug.md @@ -0,0 +1,52 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Initramfs debug + +Inspiré de [] et [] + +On a pu constater lors de mise à jour noyau des soucis lors de la regération de l'initramfs sur des portables Debian Jessie avec des partitions chiffrées + +## En cas de soucis au démarrage du type + +~~~ +Reading all physical volumes. This may take a while ... +No volume groups found +~~~ + +On obtient souvent avant l'invit initramfs et busybox une note du type + +~~~ +Alert ! /dev/disk/by-uuid/dc0e0033-1e4c-41f9-8ebb-e3d3f8e03459 does not exist. Dropping to a shell! +~~~ + +C'est souvent lié à un changement mal géré de UUID sur l'une des partitions (notamment chiffré voire plus rarement un cas de mauvaise gestion d'ajout de partition en LVM [non traité ici] ) + +Il faut avoir en tête que la syntaxe de /etc/crypttab (fichier listant les partitions qui seront déchiffrés au démarrage [[]]) +peut être soit : +~~~ +sda7_crypt UUID=459a6a8b-0e49-4ba2-b436-6b97400bf761 none luks +~~~ +ou +~~~ +sda7_crypt /dev/sda7 none luks +~~~ + +Le conseil est donc à l'aide de [] de se chroot sur le système (sans oublier d'efi) et de modifier le /etc/crypttab (voire /etc/fstab) avec des /dev/sdaX plutôt que les UUID (à moins de les valider/verifier avec _ls -l /dev/disk/by-uuid_ ou _blkid_) + +L'autre conseil est de ne pas utiliser l'utilitaire update-initramfs pour regénérer les initrd.img du type + +~~~ +update-initramfs -k -all -u +~~~ + +## Préférer la méthode suivante +(en ayant fait un backup de votre /boot/initrd.img-${uname -r} (ex : /boot/initrd.img-3.16.0-4-amd64 )) : + +~~~ +cd /boot/initramfs +find . | cpio -H newc --create --verbose | gzip -9 > ../initrd.img-${uname -r} +~~~ + +Puis réinstallez grub + + diff --git a/HowtoIrssi.md b/HowtoIrssi.md new file mode 100644 index 00000000..b9f3b100 --- /dev/null +++ b/HowtoIrssi.md @@ -0,0 +1,57 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto irssi + + + +## Syntaxe Vim irssilog + +~~~ +$ mkdir -p ~/.vim/syntax +$ wget ' -O ~/.vim/syntax/irssilog.vim + +vim 2016-08.log +:syntax on +:set syntax=irssilog +~~~ + +## Gérer les "window" + +~~~ +/WINDOW show x # créer une vue splité sur la fenêtre x +/WINDOW close # fermer la fenêtre courante +/WINDOW shrink|grow # rétrécir ou agrandir la fenêtre courante +/WINDOW balance # taille des fenêtres visible à l'identique +/WINDOW move x # déplace la fenêtre actuelle sur le numéro x +/WINDOW move UP # déplace la fenêtre sur celle du dessus +/WINDOW number x # change le numéro de la fenêtre active +/WINDOW show x # séparer la frame en deux avec la fenêtre x affiché : il faut que le mode 'sticky' soit désactivé pour cette fenêtre /WINDOW stick off +/WINDOW log ON #activer les logs pour cette fenêtre <- afin de faire une surveillance sur le fichier ou autre possibilité +~~~ + +Ne pas hésiter à sauvegarder sa session actuelle (thème) +~~~ +/SAVE +~~~ + +## Action selon touche pressé + +~~~ +/BIND ^[OP key F1 +/BIND ^[11~ key F1 +/BIND F1 /me a besoin d'aide ! +~~~ + +## Envoyer une commande CTCP à un utilisateur + +~~~ +/CTCP user (PING|VERSION|USERINFO|CLIENTINFO|TIME) +~~~ + +## Scripts sur irssi + +Créer ou copier les scripts dans ~/.irssi/scripts/ +~~~ +/SCRIPT load +/SCRIPT unload +~~~ diff --git a/HowtoJava.md b/HowtoJava.md new file mode 100644 index 00000000..f0434483 --- /dev/null +++ b/HowtoJava.md @@ -0,0 +1,113 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Java + + + + + +## Installation Java + +Sous Debian 6, Sun Java 6 ou OpenJDK 6. +Sous Debian 7, OpenJDK 6 ou 7. +Sous Debian 8, OpenJDK 7 (ou 8 via backports). + +### Installer OpenJDK 8 sous Debian 7 + +à compléter. + +### Installer Oracle Java 8 sous Debian 7 et 8 + +Le plus simple est de créer un package automatiquement en utilisant le tar.gz du site oracle. +La procédure à suivre est ici : + +## Java sécurité + +### Importer un certificat racine + +Java stocke ces certificats dans un fichier, situé dans _/usr/lib/jvm/java-6-sun/jre/lib/security/cacerts_ (sous Debian). + +Pour lister les certificats : +~~~ +$ keytool -list -v -keystore /usr/lib/jvm/java-6-sun/jre/lib/security/cacerts +~~~ + +Pour importer un nouveau certificat, on peut utiliser la commande keytool : +~~~ +$ keytool -import -v -file certificat.cer -alias -keystore /usr/lib/jvm/java-6-sun/jre/lib/security/cacerts +~~~ + +(/usr/lib/jvm/java-6-sun/jre/lib/security/cacerts est en fait un lien symbolique vers /etc/java-6-sun/security/cacerts). + +Il est ensuite demandé un mot de passe pour ouvrir la base de données des certificats. Par défaut, il s'agit de _changeit_. + +Si vous ne précisez pas d'alias vous pourriez rencontrer l'erreur suivante : +~~~ +keytool error: java.lang.Exception: Certificate not imported, alias already exists +~~~ + +Basiquement, cela peut vouloir dire que le certificat a déjà été importé avec l'alias par défaut: mykey, il faudra donc trouver un autre nom pour importer le certificat. + +Pour supprimer un certificat (parce qu'il est expiré par exemple) : +~~~ +$ keytool -delete -keystore /usr/lib/jvm/java-6-sun/jre/lib/security/cacerts -alias +~~~ + +### Java Cryptography Extension (JCE) + + + +Sous squeeze : + +Télécharger le fichier ici : + +~~~ +# dpkg-divert --add --rename --divert /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security/US_export_policy.jar.debianorig /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security/US_export_policy.jar +# dpkg-divert --add --rename --divert /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security/local_policy.jar.debianorig /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security/local_policy.jar +- (Télécharger sur votre poste) sur le site d'oracle : | scp sur le serveur +# cd /home/$USER +# unzip jce_policy-6.zip +# cp jce/US_export_policy.jar /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security/ +# cp jce/local_policy.jar /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security/ +# chmod 644 /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security/*.jar +~~~ + +Il faut aussi modifier `/etc/java-6-sun/security/java.security`, en mettant les lignes suivantes après `# List of providers and their preference orders (see above):` + +~~~ +security.provider.1=org.jasypt.hibernate.type.EncryptedStringType +security.provider.2=sun.security.rsa.SunRsaSign +security.provider.3=com.sun.net.ssl.internal.ssl.Provider +security.provider.4=com.sun.crypto.provider.SunJCE +security.provider.5=sun.security.jgss.SunProvider +security.provider.6=com.sun.security.sasl.Provider +security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI +security.provider.8=sun.security.smartcardio.SunPCSC +security.provider.9=sun.security.provider.Sun +~~~ + +Sous Wheezy avec JRE Oracle (pas OpenJDK) : + +Télécharger le fichier ici : + +~~~ +# cd /home/$USER +# unzip UnlimitedJCEPolicyJDK7.zip +# cp UnlimitedJCEPolicy/US_export_policy.jar /usr/local/opt/jdk1.7.0_45/jre/lib/security/ +# cp UnlimitedJCEPolicy/local_policy.jar /usr/local/opt/jdk1.7.0_45/jre/lib/security/ +# chmod 644 /usr/local/opt/jdk1.7.0_45/jre/lib/security/*.jar +~~~ + +Il faut aussi modifier `/usr/local/opt/jdk1.7.0_45/jre/lib/security/java.security`, en mettant les lignes suivantes après `# List of providers and their preference orders (see above):` + +~~~ +security.provider.1=org.jasypt.hibernate.type.EncryptedStringType +security.provider.2=sun.security.rsa.SunRsaSign +security.provider.3=com.sun.net.ssl.internal.ssl.Provider +security.provider.4=com.sun.crypto.provider.SunJCE +security.provider.5=sun.security.jgss.SunProvider +security.provider.6=com.sun.security.sasl.Provider +security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI +security.provider.8=sun.security.smartcardio.SunPCSC +security.provider.9=sun.security.provider.Sun +~~~ \ No newline at end of file diff --git a/HowtoJenkins.md b/HowtoJenkins.md new file mode 100644 index 00000000..bf125cad --- /dev/null +++ b/HowtoJenkins.md @@ -0,0 +1,55 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + + +# *Installation* + +Jenkins n’est pas disponible dans les dépôts Debian, il faut donc ajouter le dépôt comme suit: + + +~~~ +wget -q -O - | sudo apt-key add - +sudo sh -c 'echo deb binary/ > /etc/apt/sources.list.d/jenkins.list' +~~~ + +Ensuite on procède à l’installation: + +~~~ +apt update +apt install jenkins +~~~ + + +# *Configuration* + +Par défaut Jenkins utilise le port 8080, pour modifier cela, il faut modifier le fichier /etc/default/jenkins et remplacer la ligne suivante: + +~~~ +HTTP_PORT=8080 +~~~ + +Par le port souhaité. + +~~~ +HTTP_PORT=XXXX +~~~ + +Le */home* de jenkins se trouve dans: + +~~~ +/var/lib/jenkins/ +~~~ + +Il faut crée par exemple la clé ssh de jenkins dans ce répertoire, en ce connectant avec l'utilisateur jenkins en faisant: + +~~~ +su - jenkins +~~~ + +Puis générer la clé SSH. + +## Vhost ngix / apache + +Pour créer un vhost pour Jenkins avec nginx ou apache, cela se fait sans particularité spéciale voir les wiki associés: + +[] +[] diff --git a/HowtoKVM/OpenBSD.md b/HowtoKVM/OpenBSD.md new file mode 100644 index 00000000..36302450 --- /dev/null +++ b/HowtoKVM/OpenBSD.md @@ -0,0 +1,48 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto OpenBSD sous KVM + +## Installation + +~~~ +$ kvm-img create -f qcow2 routeur0.qcow2 3G +Formatting 'routeur0.qcow2', fmt=qcow2 size=3221225472 encryption=off cluster_size=0 +$ wget +# kvm -hda routeur0.qcow2 -cdrom cd48.iso -boot d -m 384 -k fr -net nic,model=e1000 -net tap,vlan=0,ifname=tap0 +~~~ + +Ensuite on redémarre ainsi : + +~~~ +# kvm -hda routeur0.qcow2 -m 384 -k fr -net nic,model=e1000 -net tap,vlan=0,ifname=tap0 +~~~ + +Attention, avant le démarrage d'OpenBSD, on doit désactiver _mpbios_ : + +~~~ +>> OpenBSD/adm64 BOOT 3.15 +bsd> bsd -c +UKS> disable mpbios + 52 mpbios0 disabled +UKS> quit +~~~ + +...puis, une fois démarré, on désactive définitivement : + +~~~ +# config -ef /bsd +disable mpbios +quit +~~~ + +## Avec libvirt + +Dans cet exemple, on utilise les drivers virtio supportés dans OpenBSD depuis la 5.3 ( ). + +On n'oublie pas de spécifier la disposition clavier, car elle peut poser problème lorsque l'on se connecte en VNC. + +~~~ +virt-install -r 1024 --vcpus=1 --os-variant=openbsd4 --accelerate -v -c install54.iso -w bridge:lan0,model=virtio --vnc --disk path=routeur0.img,bus=virtio --name routeur0 -k fr +~~~ + +Une fois l'installation terminée, la commande virsh start routeur0 permettra de démarrer la nouvelle VM. \ No newline at end of file diff --git a/HowtoKVM/Ubuntu.md b/HowtoKVM/Ubuntu.md new file mode 100644 index 00000000..06ae9b3a --- /dev/null +++ b/HowtoKVM/Ubuntu.md @@ -0,0 +1,29 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Ubuntu sous KVM + +## Ubuntu 12.04 LTS server + +Après installation, Ubuntu 12.04 LTS server lance un démarrage + ou - graphique (bootsplash & co). +Cela empêche d'avoir un accès "console" via KVM. + +La solution est de désactiver le démarrage "graphique". + +Dans le fichier /etc/default/grub décommenter la ligne : +~~~ +GRUB_TERMINAL=console +~~~ + +Puis +~~~ +# update-grub2 +Generating grub.cfg ... +Found linux image: /boot/vmlinuz-3.8.0-34-generic +Found initrd image: /boot/initrd.img-3.8.0-34-generic +Found linux image: /boot/vmlinuz-3.8.0-29-generic +Found initrd image: /boot/initrd.img-3.8.0-29-generic +Found memtest86+ image: /boot/memtest86+.bin +done +# reboot +The system is going down for reboot NOW! +~~~ diff --git a/HowtoKeepalived.md b/HowtoKeepalived.md new file mode 100644 index 00000000..28166cfa --- /dev/null +++ b/HowtoKeepalived.md @@ -0,0 +1,11 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Keepalived + + + +~~~ +# aptitude install keepalived +~~~ + +Configuration via _/etc/keepalived/keepalived_ \ No newline at end of file diff --git a/HowtoKernelTuning.md b/HowtoKernelTuning.md new file mode 100644 index 00000000..a3e5ff42 --- /dev/null +++ b/HowtoKernelTuning.md @@ -0,0 +1,2 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + diff --git a/HowtoLAMP.md b/HowtoLAMP.md new file mode 100644 index 00000000..bfea6cec --- /dev/null +++ b/HowtoLAMP.md @@ -0,0 +1,18 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + + +## Dépôts DotDeb + +Le dépôt [DotDeb](http://www.dotdeb.org/) contient des versions plus à jour des paquets apache2, mysql… pour la version stable de Debian. Il peut être intéressant de l'ajouter sur un serveur LAMP. + +Pour l'utiliser, on ajoute simplement les lignes suivantes dans les sources d'apt : +~~~ +deb stable all +deb-src stable all +~~~ + +Ensuite, on ajoute la clé publique du dépôt comme ceci : +~~~ +gpg --keyserver keys.gnupg.net --recv-key 89DF5277 +gpg -a --export 89DF5277 | sudo apt-key add - +~~~ \ No newline at end of file diff --git a/HowtoLAMP/AwStats.md b/HowtoLAMP/AwStats.md new file mode 100644 index 00000000..9d20d4d6 --- /dev/null +++ b/HowtoLAMP/AwStats.md @@ -0,0 +1,95 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Awstats + +## Installation + +~~~ +# aptitude install awstats +~~~ + +## Configuration + +Pour commencer, on va déplacer la configuration d'origine dans un autre fichier afin de pouvoir créer de multiples configurations qui se baseront sur la configuration d'origine. + +~~~ +# cd /etc/awstats +# grep -v awstats.conf.local awstats.conf > awstats.conf.local +~~~ + +Le fichier _/etc/awstats/awstats.conf.local_ doit être adapté : + +~~~ +LogFormat=1 +AllowFullYearView=3 +WarningMessages=1 +ErrorMessages="An error occured. Contact your Administrator" +~~~ + +Ensuite, on va créer modifier le fichier /etc/awstats/awstats.conf avec le contenu suivant : + +~~~ +Include "/etc/awstats/awstats.conf.local" +LogFile="/var/log/apache2/access.log" +SiteDomain="hosting.example.com" +DirData="/var/lib/awstats/" +ShowHostsStats=0 +ShowOriginStats=0 +ShowPagesStats=0 +ShowKeyphrasesStats=0 +ShowKeywordsStats=0 +ShowHTTPErrorsStats=0 +~~~ + +Ce fichier supprime tous les paramètres non anonyme et permet potentiellement d'avoir des statiques globales pour tous les sites d'un serveur. + +Pour un site "classique", on créera un fichier _/etc/awstats/awstats.example.conf_ ainsi : + +~~~ +Include "/etc/awstats/awstats.conf.local" +LogFile="/home/example/log/access.log" +SiteDomain="www.example.com" +DirData="/home/example/awstats" +~~~ + +Pour générer les stats de façon régulière, cela se passe dans _/etc/cron.d/awstats_ : + +~~~ +0,10,20,30,40,50 * * * * root umask 033; [ -x /usr/lib/cgi-bin/awstats.pl -a -f /etc/awstats/awstats.conf -a -r /var/log/apache2/access.log ] && /usr/lib/cgi-bin/awstats.pl -config=awstats -update >/dev/null +51 * * * * root umask 033; [ -x /usr/lib/cgi-bin/awstats.pl -a -f /etc/awstats/awstats.example.conf -a -r /home/example/log/access.log ] && /usr/lib/cgi-bin/awstats.pl -config=example -update >/dev/null +~~~ + +Enfin, pour voir les icones Awstats, on rajoutera le fichier _/etc/apache2/cron.d/awstats.conf_ ainsi : + +~~~ +Alias /awstats-icon/ /usr/share/awstats/icon/ + +Allow from all + +~~~ + +## Debug + +Voir la sortie comme le ferait apache : + +~~~ +# sudo -u vhost /usr/lib/cgi-bin/awstats.pl -config=vhost -output +~~~ + +Si erreurs de droits. Corriger. Exemple : + +~~~ +Can't locate mime.pm: ./mime.pm: Permission non accordée at /usr/lib/cgi-bin/awstats.pl line 2217. +~~~ + +## Astuces + +### Ré-injecter tout les logs + +Il faut fournir les logs au format texte et du plus vieux au plus récent dans le fichier nommé access.log. + + +~~~ +# sudo -u vhost /usr/lib/cgi-bin/awstats.pl -config=vhost -update +~~~ + diff --git a/HowtoLAMP/IonCube.md b/HowtoLAMP/IonCube.md new file mode 100644 index 00000000..0d4fc663 --- /dev/null +++ b/HowtoLAMP/IonCube.md @@ -0,0 +1,42 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## IonCube + +Voici une procédure d'installation rapide de IonCube pour PHP sur un serveur LAMP. + +* Téléchargement de ioncube_loaders (prenez la version correspondant à votre architecture) : +~~~ +# wget +# tar zxvf ioncube_loaders_lin_x86-64.tar.gz +~~~ + +* On place ensuite les fichiers au bon endroit : +~~~ +# mv ioncube /usr/local/ +~~~ + +* Puis on rajoute ceci dans un fichier que l'on nomme _/etc/php5/conf.d/ioncube.ini_ (prenez le .so correspondant à la version de PHP installée) : +~~~ +zend_extension = /usr/local/ioncube/ioncube_loader_lin_5.4.so +~~~ + +---- + +* Sur Debian Jessie, le fichier est : /etc/php5/mods-available/ioncube.ini. + +~~~ +zend_extension = /usr/local/ioncube/ioncube_loader_lin_5.6.so +~~~ + +Puis on fait un lien symbolique de /etc/php5/apache2/conf.d/00-ioncube.ini -> /etc/php5/mods-available/ioncube.ini (Le 00 est important, si il n'est pas chargé en premier, ioncube génére une erreur fatale est fait crasher Apache) + +~~~ +ln -s /etc/php5/mods-available/ioncube.ini /etc/php5/apache2/conf.d/00-ioncube.ini +~~~ + +---- + +* Enfin, on redémarre Apache +~~~ +# /etc/init.d/apache2 restart +~~~ \ No newline at end of file diff --git a/HowtoLAMP/MySQL.md b/HowtoLAMP/MySQL.md new file mode 100644 index 00000000..0fee0984 --- /dev/null +++ b/HowtoLAMP/MySQL.md @@ -0,0 +1,31 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +Pour installer, configurer et administrer MySQL, voir [wiki:HowtoMySQL] + +## phpMyAdmin + +~~~ +# aptitude install phpmyadmin +~~~ + +Il est conseillé de ne pas rendre accessible _phpMyAdmin_ via une URL "devinable" +et/ou l'autoriser uniquement depuis certaines adresses IP. + +L'idée est ainsi d'ajouter au Virtualhost _default_ : + +~~~ +Alias /phpmyadmin-SwasHyk4 /usr/share/phpmyadmin/ +~~~ + +## Interdire l'écriture sur un slave + + + +--read-only + +Cause the slave to permit no updates except from slave threads or from users having the SUPER privilege. On a slave server, this can be useful to ensure that the slave accepts updates only from its master server and not from clients. This variable does not apply to TEMPORARY tables. + +## Diagnostic des erreurs + +Errno 24 : + diff --git a/HowtoLAMP/PHP.md b/HowtoLAMP/PHP.md new file mode 100644 index 00000000..2deed554 --- /dev/null +++ b/HowtoLAMP/PHP.md @@ -0,0 +1,317 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto PHP + + + +* Debian 6 : PHP 5.3.3 +* Debian 7 : PHP 5.4.45 +* Debian 8 : PHP 5.6.19 +* Debian 9 : PHP 7.0.10 + + +## Installation + +Installation avec Apache : + +~~~ +# apt install php5 libapache-mod-php5 php5-gd php5-imap php5-ldap php5-mcrypt php5-mhash php5-mysql php5-pgsql php-gettext librsvg2-bin +~~~ + +PHP est ainsi actif. On le vérifiera aisément avec : + +~~~ +$ php -v +PHP 5.6.19-0+deb8u1 (cli) (built: Mar 14 2016 10:22:33) +Copyright (c) 1997-2016 The PHP Group +Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies + with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies + +# echo "" > /var/www/info.php + +$ wget +~~~ + +### Paquet PHP7.0 Dotdeb Jessie + +Il suffit d'installer le sources.list de Dotdeb. + +~~~ +deb jessie all +~~~ + +Et d'installer les paquets nécessaires. Voici un exemple pour un serveur Apache : + + +~~~ +php-common php7.0-cli php7.0-common php7.0-json php7.0-opcache php7.0-readline php7.0-ssh2 php7.0-curl php7.0-gd php7.0-mongodb php7.0-zip php7.0-xml php7.0-mbstring libapache2-mod-php7.0 +~~~ + +Attention : Cela casse le paquet officiel Debian de phpmyadmin, à cause d'une dépendance en dur au paquet 5.6. + + +## Configuration de base + +Il existe un fichier _php.ini_ suivant l'utilisation de PHP : Apache, CLI, FPM, etc. +Pour un exemple de "sécurisation" de PHP pour Apache via _/etc/php5/apache2/php.ini_ : + +~~~ +short_open_tags = Off +disable_functions = exec, shell-exec, system, passthru, putenv, popen +expose_php = Off +display_errors = Off +log_errors = On +allow_url_fopen = Off +memory_limit = 128M +max_execution_time = 10 +open_basedir = /home +~~~ + +Note : par défaut, les erreurs PHP sont enregistrés dans le fichier _ErrorLog_ du VVirtualHost Apache. + + +## Cache/accélérateur pour PHP + +Depuis PHP 5.6 (Debian 8), un cache d'OPcode (code "intermédiaire" généré par PHP) est intégré à PHP permet d'accélérer la génération du résultat des scripts PHP. +Il remplace les accélérateurs comme APC, eAccelerator, etc. utilisé dans les versions précédentes de PHP. +C'est le module OpCache configurable via /etc/php5/mods-available/opcache.ini + +La valeur de cache par défaut est de 64M, paramètre *opcache.memory_consumption* + +Pour surveiller OpCache on peut utiliser : +- [[BR]] +- Plugin Munin + + + +### APC (deprecated) + + + +En PHP 5.3/5.4 (Debian 6/7), on installait souvent le module APC pour accélérer la génération des scripts PHP. + +~~~ +aptitude install php-apc +~~~ + +La directive `apc.enabled`, qui détermine l'activation d'APC, est à 1 par défaut. Elle s'active uniquement globalement +(pour désactiver/activer par VirtualHost, on utilisera la directive _apc.cache_by_default_). + +Example de configuration apc.ini : + +~~~ +extension=apc.so +apc.stat = 1 +apc.include_once_override = 0 +apc.shm_size=256M +apc.enabled = 1 +apc.cache_by_default = 1 +~~~ + +Ne pas oublier de faire : + +~~~ +# sysctl -w kernel.shmmax=536870912 +# echo 'kernel.shmmax=536870912' >> /etc/sysctl.conf +~~~ + +Pour activer APC pour un site en particulier, on ajoutera dans son VirtualHost : + +~~~ +php_admin_value apc.cache_by_default 1 +~~~ + +Un script est fourni par Debian pour accéder aux statistiques APC. Il suffit de le déposer dans un répertoire accessible par le serveur web : + +~~~ +# zcat /usr/share/doc/php-apc/apc.php.gz >/var/www/apc.php +~~~ + +Positionner un mot de passe dans le fichier _apc.php_ pour pouvoir vider le cache APC via cette page... + +Il peut arriver que le error.log grossisse de façon alarmante avec la configuration par défaut en cas de fort trafic : + +~~~ +[apc-warning] Unable to allocate memory for pool. in /var/www/foo/bar.php on line XXX +~~~ + +Il suffit généralement d'augmenter la taille du cache APC dans /etc/php5/apache2/conf.d/apc.ini : + +~~~ +apc.shm_size=64 +~~~ + +Pour augmenter le cache à 64Mo. + +/!\ Préciser l'unité (MB ou Mo) peut empêcher apache de redémarrer, par défaut le cache est déjà en MB /!\ +/!\ Assurez-vous d'avoir une valeur kernel de kernel.shmmax supérieur (à adapter avec sysctl) /!\ + +### APcu + +Pour faire du cache de clé-valeur sans installer un service externe (comme Memcached par exemple), on pourra installer APCu. + + +## Sessions PHP + + + +Lorsque des sessions PHP sont utilisées (fonctions session_*() dans le code), des informations sont stockées côté serveur. +Le navigateur conserve uniquement identifiant pour accéder à ces informations, stockés dans un cookie ou une variable du type PHPSESSID dans l'URL (cela tend à être obsolète). + +Par défaut, ces informations sont conservées dans des fichiers sur le disque (un fichier par session) mais il est conseillé d'utiliser +une méthode plus performante si vous avez un serveur dédié. Évidemment il est EXCLU de stocker les sessions dans une base de données SQL +sauf si vous voulez payer cher pour avoir un site lent et tuer des bébés phoques. + +* La plus simple si votre site web est en mono-serveur ou en mode sticky : monter le répertoire qui stocker les fichiers en *TMPFS*. +Cela se fait par exemple en ajoutant la ligne suivante dans votre _fstab_ : +~~~ +tmpfs /var/lib/php5 tmpfs defaults,noexec,nosuid,nodev,size=256m 0 0 +~~~ + +* Les sessions peuvent être stockées dans un ou plusieurs serveurs *Memcached* avec les paramètres suivants : +~~~ +session.save_handler = memcached +session.save_path = "192.0.43.10:11211,192.0.43.11:11211" +~~~ + +Par contre, contrairement aux idées reçues, ce n'est pas conseillé. Memcached est fait pour "cacher" et non "stocker". +Voir le blog d'un développeur de Memcached à ce sujet : + +* Les sessions peuvent être stockées dans un ou plusieurs serveurs *Redis* avec les paramètres suivants : +~~~ +session.save_handler = redis +session.save_path = "tcp://192.0.43.10:6379?auth=,tcp://192.0.43.11:6379?auth=" +~~~ + +* Les sessions peuvent être stockées dans [Sharedance](http://www.pureftpd.org/project/sharedance), un petit logiciel spécialement conçu pour +stocker les sessions PHP. Il n'est plus maintenu, mais très simple, il est toujours fonctionnel. Voici un exemple d'utilisation : +~~~ +auto_prepend_file = /usr/local/etc/sharedance.php +;session.save_handler = user +;session.save_handler = files +~~~ + +* Les sessions peuvent être stockées dans *Tokyo Tyrant/Tycoon* avec les paramètres suivants : +~~~ +tokyo_tyrant.session_salt="randomlongstring" +session.save_handler=tokyo_tyrant +session.save_path="tcp://192.0.43.10:1978,tcp://192.0.43.10:1978" +~~~ + +## Modules de paiement + +### SPPlus + +Pré-requis : +~~~ +# apt install php5-dev +~~~ + +Attention à bien vérifier que /tmp n'est pas monté en noexec pour la suite. + +Compilation du module : +~~~ +cd /tmp +wget +tar xzf spplus-1.2.tar.gz +cd spplus-1.2 +phpize +./configure +make +cp modules/php_spplus.so /usr/lib/php5// +chmod 644 /usr/lib/php5//php_spplus.so +~~~ + +Ajout dans la conf PHP : +~~~ +echo "extension=php_spplus.so" >/etc/php5/conf.d/spplus.ini +chmod 644 /etc/php5/conf.d/spplus.ini +~~~ + +## Module de protection suhosin (deprecated) + + + +Suhosin était un module du projet Hardened-PHP permettant d'ajouter une couche de protection à PHP. +Il existait en PHP 5.2/5.3 (Debian 6/7), mais n'existe plus en PHP 5.6 (Debian 8). + +~~~ +# aptitude install php5-suhosin +~~~ + +Un exemple de configuration dans le fichier _/etc/php5/conf.d/suhosin.ini_ : + +~~~ +extension=suhosin.so + +;log +suhosin.log.syslog = S_ALL +;mode "simulation" pour tester +;suhosin.simulation = On +;empecher d'augmenter le memory_limit défini +suhosin.memory_limit = 0 +;Action en cas de soucis +;suhosin.filter.action = 406, +suhosin.filter.action = 406 +;Fonctions interdites +suhosin.executor.func.blacklist="exec,shell-exec,system,passthru,putenv,popen" +;Restrictions sur les variables GET/REQUEST/POST... +suhosin.get.max_name_length = 126 +suhosin.request.max_varname_length = 256 +suhosin.request.max_array_index_length = 128 +suhosin.request.max_vars = 1000 +suhosin.post.max_vars = 1000 +~~~ + +## Module du framework phalcon + + + + +Installer les dépendances suivantes : +~~~ +apt install php5-dev libpcre3-dev gcc make php5-mysql +~~~ + +Cloner la dernière version stable (2.0.x à ce jour) : +~~~ +git clone --depth=1 git://github.com/phalcon/cphalcon.git -b 2.0.x +~~~ + +Compiler et installer le module : +~~~ +cd cphalcon/build +sudo ./install +~~~ + +Configurer PHP et Apache : +~~~ +# Dans le fichier /etc/php5/mods-available/phalcon.ini +extension=phalcon.so +# Puis activer le module +ln -s /etc/php5/mods-available/phalcon.ini /etc/php5/cli/conf.d/30-phalcon.ini +ln -s /etc/php5/mods-available/phalcon.ini /etc/php5/apache2/conf.d/30-phalcon.ini +service apache2 reload +~~~ + +Installer les phalcon devtools : +~~~ +git clone -b 2.0.x /opt/phalcon-devtools +ln -s /opt/phalcon-devtools/phalcon.php /usr/local/bin/phalcon +chmod ugo+x /usr/local/bin/phalcon +~~~ + +## FAQ + +* J'ai un message d'erreur du type : _/usr/lib/php5/20090626/xcache.so doesn't appear to be a valid Zend extension_ + +Réponse : remplacer zend_extension= par extension= pour le chargement du module PHP + +* Certaines fonctions GD n'existent pas : imagerotate(), imageantialias(), etc. + +Réponse : Pour des raisons de sécurité et de maintenabilité, la version de +PHP de Debian n'embarque par le GD modifié par PHP. Ces fonctions ne sont +pas disponibles. Pour contourner ce problème, nous conseillons d'écrire vos +propres fonctions (il y a des exemples sur +Cela peut éventuellement être mis dans un fichier partagé qui +sera ensuite inclus systématiquement dans votre code lorsque +l'utilisation est nécessaire. diff --git a/HowtoLAMP/PHP/Debug-Analyse-Performance.md b/HowtoLAMP/PHP/Debug-Analyse-Performance.md new file mode 100644 index 00000000..1cac2d74 --- /dev/null +++ b/HowtoLAMP/PHP/Debug-Analyse-Performance.md @@ -0,0 +1,48 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowTo Debug PHP + +Diverses astuces pour débuger / identifier / analyser des soucis de performances. + +## strace + +Au niveau système, pour voir exactement ce qui est fait. (Ouverture de fichiers, connexion distante, requêtes MySQL). +Exemple d'utilisations. + + +~~~ +# Affiche les fichiers ouverts. +$ strace -ff -e trace=open php index.php +# Affiche les appels réseaux. +$ strace -ff -e trace=network php index.php +# Compte les appels systèmes et le temps passé. +$ strace -c php index.php +# Calcul du temps d'exécution d'un appel. +$ strace -T php index.php +# Affichage d'un timestamp devant chaque appel. +$ strace -ttt php index.php +# Strace verbeux. +$ strace -s 65535 -ff php index.php +~~~ + +Dans certains cas, des CMS gèrent mal le fait qu'on exécute le code via PHP-CLI. On pourra utiliser PHP-CGI pour le tromper, c'est notamment le cas de Magento. + +~~~ +$ HTTP_HOST="www.monsite.com" strace php-cgi index.php +~~~ + +Par exemple, peut récupérer les requêtes MySQL ainsi. + +~~~ +$ strace -s65535 -e trace=write -ff -o strace php-cgi index.php +$ grep SELECT strace.* +~~~ + + +## xdebug + +Voir : + +## MySQL + +On pourra activer les slow queries (voir : en mettant une valeur à 0 pour voir toutes les requêtes par exemple. \ No newline at end of file diff --git a/HowtoLAMP/PHP/HHVM.md b/HowtoLAMP/PHP/HHVM.md new file mode 100644 index 00000000..a23ea32c --- /dev/null +++ b/HowtoLAMP/PHP/HHVM.md @@ -0,0 +1,61 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto HHVM + +## Installation + +Doc officielle : + + + +~~~ +# apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449 +# echo deb jessie main > /etc/apt/sources.list.d/hhvm.list +# apt update && apt install hhvm +~~~ + + +## Configuration + +Fichier /etc/hhvm/server.ini. + +On pourra passer en mode socket plutôt que sur un port TCP. + +~~~ +;hhvm.server.port = 9000 +hhvm.server.file_socket=/var/run/hhvm/sock +~~~ + + +## Mise en place avec NginX + + +~~~ +# /usr/share/hhvm/install_fastcgi.sh +# /etc/init.d/nginx restart +~~~ + +Cela crée le fichier /etc/nginx/hhvm.conf. + +~~~ +location ~ \.(hh|php)$ { + fastcgi_keep_conn on; + #fastcgi_pass 127.0.0.1:9000; + fastcgi_pass unix:/var/run/hhvm/sock + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; +} +~~~ + +HHVM écoute par défaut sur le port 9000. (Attention si vous avez une configraution FPM qui écoute aussi sur ce port là). +Il faudra inclure ce fichier de configuration dans votre vhost qui a besoin de HHVM. + + +~~~ +include /etc/nginx/hhvm.conf; +~~~ + +## Mise en place avec Apache + +TODO \ No newline at end of file diff --git a/HowtoLAMP/PHP/coredump.md b/HowtoLAMP/PHP/coredump.md new file mode 100644 index 00000000..3f80d759 --- /dev/null +++ b/HowtoLAMP/PHP/coredump.md @@ -0,0 +1,63 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + + + + +Installation : + +~~~ +# aptitude install gdb php5-dbg +# echo 1 > /proc/sys/kernel/core_uses_pid +~~~ + +Note : En Squeeze il est nécessaire d'utiliser le gdb de squeeze-backports. + +Pour activer : + +~~~ +# mkdir /home/coredump +# chmod 1777 /home/coredump +# echo '/home/coredump/core-%e-%p' > /proc/sys/kernel/core_pattern +# echo "* soft core unlimited" >> /etc/security/limits.conf +# ulimit -c unlimited +# echo "ulimit -c unlimited" >> /etc/default/apache2 +# /etc/init.d/apache2 restart +~~~ + +Pour désactiver : + +~~~ +# echo '' > /proc/sys/kernel/core_pattern +~~~ + +Pour lire les traces de PHP-FPM : + +~~~ +$ gdb /usr/sbin/php-fpm core-php5-fpm.7409 + +(gdb) bt +(gdb) bt -100 +~~~ + +## Quelques messages typiques + +Erreurs de mémoire (souvent des boucles) : + +~~~ +#0 xbuf_format_converter (xbuf=0x77a812cee810, fmt=0xa6d5a1 "%ld", ap=Cannot access memory at address 0x77a812cedf10) + +#0 0x00007ffd348abe53 in _zend_mm_free_canary_int (heap=0x7ffd39b11130, p=0x21143c453bb97f0f) at /build/buildd/php5-5.3.2/Zend/zend_alloc_canary.c:2090 +2090 /build/buildd/php5-5.3.2/Zend/zend_alloc_canary.c: No such file or directory. + in /build/buildd/php5-5.3.2/Zend/zend_alloc_canary.c + +#0 0x00000000007e10b1 in zend_mm_free_cache () +~~~ + +Astuce : utiliser xdebug pour en savoir plus sur la boucle (xdebug étant limité à 100 récursions, il affichera les infos via une PHP Fatal Error : + +~~~ +Fatal error: Maximum function nesting level of '100' reached, aborting! in [...] +~~~ + + + diff --git a/HowtoLAMP/PHP/xdebug.md b/HowtoLAMP/PHP/xdebug.md new file mode 100644 index 00000000..c3cc1e16 --- /dev/null +++ b/HowtoLAMP/PHP/xdebug.md @@ -0,0 +1,42 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto xdebug + +~~~ +# aptitude install php5-xdebug +~~~ + +Pour l'activer, dans _/etc/php5/conf.d/xdebug.ini_ : + +~~~ +zend_extension=/usr/lib/php5/20090626/xdebug.so +xdebug.auto_trace=On +xdebug.profiler_enable=1 +xdebug.profiler_output_dir=/home/xdebug +xdebug.trace_output_dir=/home/xdebug +~~~ + +Attention, bien mettre le bon chemin de l'extension zend (dépend de votre version PHP) et les droits sur le répertoire _/home/xdebug_. Notez qu'il peut se remplir très vite une fois activé ! + +On obtient des fichiers _trace.XXX.xt_ et _cachegrind.out.XXXX_ + +Le fichier xt est une trace de tout les appels aux fonctions PHP du code préfixé par le temps d'exécution. Idéal pour trouver une fonction anormalement longue. +La seconde colonne contient l'empreinte mémoire, idéal aussi pour répérer une fonction qui utilise trop de mémoire. + +Le fichier _cachegrind_ peuvent être lus avec l'outil kcachegrind (pour Linux) ou wincachegrind (sous Windows), cela permet de schématiser les appels aux fonctions PHP et de voir le temps passé en % et le nombre d'appels. +Voici un exemple : + +[[Image(call1.png)]] + +Ici, 30% du temps est passé dans php::uasort, appelé par Mage_Core_Model_Layout->getOutput. + +## Webgrind + +Webgrind en PHP permet de faire comme kcachegrind mais via un navigateur. + + +~~~ +$ git clone +~~~ + +Puis dans le fichier de configuration config.php on mettre profilerDir à /home/xdebug. Il faut aussi installer le package graphviz et mettre dotExecutable à /usr/bin/dot si on veut profiter du graphique « call graph ». \ No newline at end of file diff --git a/HowtoLAMP/Performances.md b/HowtoLAMP/Performances.md new file mode 100644 index 00000000..6e2e7a36 --- /dev/null +++ b/HowtoLAMP/Performances.md @@ -0,0 +1,91 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Performances sur une plateforme LAMP + + + + +Les performances d'une plateforme web, cela signifie : + +* Un affichage rapide pour vos visiteurs/utilisateurs (critère A) +* Une utilisation minimale des ressources de votre infrastructure (critère B) +* Une perception performante pour les moteurs de recherche (critère C) + +## Au niveau applicatif + +* Choix du langage + +## Au niveau système + +* Apache/mod_php vs Apache/CGI vs Nginx/FPM ? +* Reverse/proxy/cache + +### Optimisation de la mémoire de MySQL + +### Optimisation des process Apache + +Apache sera d'autant plus réactif qu'il a des process en mode "idle" prêt à répondre. +Pour cela, il faut une méthode empirique : observer les process sur plusieurs jours/semaines/mois +avec courbes Munin par exemple, puis ajuster les valeurs pour s'assurer qu'il y a en permanence +un minimum de process en mode "idle". + +Voici un exemple d'optimisation : + +~~~ + Timeout 10 + KeepAlive On + MaxKeepAliveRequests 25 + KeepAliveTimeout 3 + StartServers 50 + MinSpareServers 30 + MaxSpareServers 50 + ServerLimit 250 + MaxClients 250 + MaxRequestsPerChild 0 +~~~ + + +### Compression GZIP / DEFLATE + +Le principe est de compresser les fichiers HTML/Javascript/CSS côté serveur, de les envoyer compressés au navigateur, et le navigateur les décompresse. + +Avec Apache, cela se fait via le module mod_deflate et avec une configuration du type : + +~~~ + + # OK avec tous la navigateurs (dont MSIE 6, si si) + AddOutputFilterByType DEFLATE text/html text/plain text/xml + + # ...bon, des vieilles versions de MSIE 6 peuvent raler pour ca... + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/x-javascript application/javascript application/ecmascript + AddOutputFilterByType DEFLATE application/rss+xml + + # On ajoute donc des exceptions : + # pour Netscape Navigator 4... + BrowserMatch ^Mozilla/4 gzip-only-text/html + BrowserMatch ^Mozilla/4.0[678] no-gzip + # ...mais tout est OK pour MSIE, on exclue de l'exclusion... + BrowserMatch \bMSIE !no-gzip !gzip-only-text/html + # ...sauf pour MSIE 6 et inferieur, que l'on exclue definitivement (paix a leurs ames). + BrowserMatch "MSIE [3456]" no-gzip + +~~~ + + +## mod_pagespeed + +Nous déconseillons l'utilisation de _mod_pagespeed_ + +Le problème principal de _mod_pagespeed_ est qu'il est mal codé : en résumé il embarque de nombreuses bibliothèques au lieu d'utiliser celles du système, ce qui pose des problèmes de sécurité, voir ; et qu'il n'est donc pas inclu dans les distributions Linux, notamment dans Debian, voir + +Deuxième problème avec "mod_pagespeed" il utilise des répertoires de cache partagés entre les différents comptes ce qui est incompatible avec le module Apache-ITK indispensable pour cloisonner les différents comptes sur un serveur. +Ce problème nécessite une configuration spécifique avec ModPagespeedFileCachePath à mettre en place dans chaque VirtualHost qui l'utilise. + +Nous préconisons plutôt l'optimisation du code HTML/JS/CSS/etc. indépendamment de "mod_pagespeed" en appliquant les préconisations via + +## Au niveau infrastructure + +* DNS +* Cloud ? +* CDN ? diff --git a/HowtoLAMP/Postfix.md b/HowtoLAMP/Postfix.md new file mode 100644 index 00000000..b5a0e4c0 --- /dev/null +++ b/HowtoLAMP/Postfix.md @@ -0,0 +1,71 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Howto Postfix pour du LAMP + +Il est désormais essentiel pour un service web de pouvoir envoyer des mails. +Pour cela, on installe Postfix et on réalise une configuration de base. + +Sous Debian : + +~~~ +# aptitude install postfix +~~~ + +Avec un fichier de configuration _main.cf_ du type : + +~~~ +smtpd_banner = $myhostname ESMTP mail server +biff = no +append_dot_mydomain = no +#delay_warning_time = 4h +myhostname = hosting.example.com +alias_maps = hash:/etc/aliases +alias_database = hash:/etc/aliases +myorigin = $myhostname +mydestination = $myhostname localhost.localdomain localhost +relayhost = +mynetworks = 127.0.0.0/8 +mailbox_size_limit = 0 +recipient_delimiter = + +inet_interfaces = all +inet_protocols = ipv4 + +minimal_backoff_time = 2h +maximal_backoff_time = 6h +maximal_queue_lifetime = 4d +queue_run_delay = 100s +bounce_queue_lifetime = 1d + +initial_destination_concurrency = 5 +default_destination_concurrency_limit = 20 + +slow_destination_rate_delay = 0 +slow_destination_concurrency_limit = 1 +slow_destination_concurrency_failed_cohort_limit = 100 +slow_destination_recipient_limit = 25 + +transport_maps = hash:$config_directory/transport +~~~ + +Et un fichier _master.cf_ du type : + +~~~ +slow unix - - n - - smtp +~~~ + +Et un fichier _transport_ du type : + +~~~ +orange.fr slow: +wanadoo.fr slow: +voila.fr slow: +laposte.net slow: +~~~ + +Faire un postmap dessus : + +~~~ +postmap transport +~~~ + +Et enfin (re)démarrer le service postfix. \ No newline at end of file diff --git a/HowtoLAMP/Squid.md b/HowtoLAMP/Squid.md new file mode 100644 index 00000000..fd604afc --- /dev/null +++ b/HowtoLAMP/Squid.md @@ -0,0 +1,145 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Squid + +Pour sécuriser le serveur web, nous installons un proxy HTTP en sortie. Cela permet d'interdire ou +de garder des traces des requêtes faites vers l'extérieur. + +## Installation + +~~~ +# aptitude install squid3 +~~~ + +## Configuration + +La configuration se passe dans le fichier _squid.conf_ qui contiendra : + +~~~ +# ports + 8888 transparent +icp_port 0 + +# ACL +#acl all src 0.0.0.0/0.0.0.0 +acl localhost src 127.0.0.1/32 +acl INTERNE src ADRESSE_IP/32 127.0.0.0/8 +acl Safe_ports port 80 # http +acl SSL_ports port 443 563 + +acl WHITELIST url_regex "/etc/squid3/whitelist.conf" + + deny !WHITELIST + allow INTERNE + deny all + +logformat combined %>a %[ui %[un [%tl] "%rm %ru HTTP/%rv" %>Hs %h" "%{User-Agent}>h" %Ss:%Sh +access_log /var/log/squid3/access.log combined +~~~ + +Le fichier _whitelist.conf_ contiendra les URLs autorisées en sortie : + +~~~ + + + + + + + + + + + + + + + + + + + + + + +~~~ + +La liste des URLs que nous utilisons en standard peut-être trouvée sur + +Il reste évidemment à rediriger les requêtes HTTP en sortie vers Squid avec IPTables : + +~~~ +/sbin/iptables -t nat -A OUTPUT -p tcp --dport 80 -m owner --uid-owner proxy -j ACCEPT +/sbin/iptables -t nat -A OUTPUT -p tcp --dport 80 -d ADRESSE_IP -j ACCEPT +/sbin/iptables -t nat -A OUTPUT -p tcp --dport 80 -d 127.0.0.1 -j ACCEPT +/sbin/iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8888 +~~~ + +### Monitoring + +Afin de détecter des oublis ou des éventuelles attaques, il sera intéressant d'ajouter la configuration suivante au logiciel _log2mail_ : + +~~~ +file = /var/log/squid3/access.log + pattern = "TCP_DENIED/403" + mailto = ADRESSE-MAIL-ALERTE + template = /etc/log2mail/template.squid +~~~ + +template.squid + +~~~ +From: %f +To: %t +Subject: Squid Alert - URL non autorisee + +Dernieres URLs non autorisees + +We have matched your pattern "%m" in "%F" %n times: + +%l + +Eventuellement autoriser l'access dans la whitelist ou verifier dangerosite de la requete. + +Yours, +log2mail. +~~~ + +On n'oubliera pas d'ajouter l'utilisateur _log2mail_ dans le groupe _proxy_ pour qu'il puisse lire ce fichier (sinon _log2mail_ plante !!) : + +~~~ +# adduser log2mail proxy +Adding user `log2mail' to group `proxy' ... +Adding user log2mail to group proxy +Done. +~~~ + +## Tips + +### Squid est lent / indispo + +Cas possible où squid tente de sortir en IPv6 alors qu'il n'y a qu'un lien local ! + +Astuce : rajouter `tcp_outgoing_address $IP` + +### Astuce "pêche à la ligne" + +Si vous voyez passer des requêtes vers des sites suspects et que vous voulez identifier quel utilisateur les provoque, voici l'astuce "pêche à la ligne" : +~~~ +# iptables -I OUTPUT -p tcp --syn -s --dport 8888 -j LOG --log-uid +~~~ + + +### Desactiver le cache + +Dans certains cas, on peut vouloir désactiver le cache de façon globale : +~~~ +cache deny all +~~~ + +### Problème avec Expect 100-continue + +En cas d'erreur 417 sur des Expect 100-continue, ajouter la directive : +~~~ +ignore_expect_100 on +~~~ \ No newline at end of file diff --git a/HowtoLFTP.md b/HowtoLFTP.md new file mode 100644 index 00000000..c69b18f7 --- /dev/null +++ b/HowtoLFTP.md @@ -0,0 +1,17 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto LFTP + +LFTP est le couteau suisse du FTP. + +~~~ +$ lftp login@ftp.example.com +~~~ + +Pour télécharger un répertoire complet : + +~~~ +> cd +> lcd +> mirror +~~~ \ No newline at end of file diff --git a/HowtoLXC.md b/HowtoLXC.md new file mode 100644 index 00000000..44d0b07d --- /dev/null +++ b/HowtoLXC.md @@ -0,0 +1,93 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowtoLXC + +## Debian 8 (JESSIE) + +## Installation + +~~~ +# apt install lxc bridge-utils libvirt-bin debootstrap +~~~ + +## Modifications réseau +~~~ +# cat /etc/network/interfaces +[...] +auto br0 +iface br0 inet static + bridge_ports eth0 + bridge_fd 0 + bridge_maxwait 0 + address 10.10.10.42 + netmask 255.255.255.0 + gateway 10.10.10.254 + +auto br1 +iface br1 inet static + pre-up brctl addbr br1 + address 10.1.0.254 + netmask 255.255.255.0 + bridge_fd 0 + post-down brctl delbr br1 +~~~ + +~~~ + /sbin/iptables -A INPUT -p tcp --sport 11371 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT + /sbin/iptables -t nat -A POSTROUTING -s 10.1.0.254/24 -o br0 -j SNAT --to *IP de l'hyperviseur* +~~~ + Activation du forwarding +~~~ +# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf +# echo "net.ipv4.conf.all.arp_announce=2" >> /etc/sysctl.conf +# echo "net.ipv4.conf.all.arp_ignore=1" >> /etc/sysctl.conf +# echo "net.ipv4.conf.all.rp_filter=0" >> /etc/sysctl.conf +# sysctl -w net.ipv4.ip_forward=1 +# sysctl -w net.ipv4.conf.all.rp_filter=0 +# sysctl -w net.ipv4.conf.all.arp_ignore=1 +# sysctl -w net.ipv4.conf.all.arp_announce=2 +~~~ + + +## Installation d'un container + +~~~ +# lxc-create -t download -n test +~~~ + +Avant de démarrer la VM mettre ces lignes dans le fichier de conf du conteneur : /var/lib/lxc/test/config + +~~~ +lxc.network.type = veth +lxc.network.link = br1 +lxc.network.ipv4 = 10.1.0.X/24 +lxc.network.ipv4.gateway = 10.1.0.254 +lxc.network.name = eth0 +lxc.network.flags = up +~~~ + +(Il est conseillé de supprimer systemd du container car ce dernier est mal géré pour le moment) +~~~ +# apt install sysvinit-core +~~~ + +## Utilisation + +~~~ +Démarrer un conteneur : +# lxc-start -n test -d + +Entrer dans un conteneur : +# lxc-attach -n test + +Arreter un conteneur : +# lxc-stop -n test +~~~ + +~~~ +# lxc-info -n test-container +# lxc-console -n test-container +# lxc-halt -n test-container +# lxc-info -n test-container +# lxc-destroy -n test-container +~~~ \ No newline at end of file diff --git a/HowtoLetsEncrypt.md b/HowtoLetsEncrypt.md new file mode 100644 index 00000000..e2aa28a9 --- /dev/null +++ b/HowtoLetsEncrypt.md @@ -0,0 +1,82 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto LetsEncrypt + +Documentation officielle : + +Dans tout les cas, il faut un client pour communiquer avec les serveurs de Let's Encrypt et obtenir le certificat. Il en existe plusieurs. L'officiel est + +## Client officiel (Certbot) + +Certbot est disponible en paquet sous Debian à partir des backports de Jessie. + +Pour l'installer, il faut donc être en Debian Jessie avec les backports de configurés, puis : +~~~ +apt install certbot -t jessie-backports +~~~ + +### Création d'un utilisateur dédié + +Afin de ne pas faire tourner certbot avec l'utilisateur root et de ne pas lui donner accès aux clés SSL, nous allons faire tourner certbot avec un utilisateur dédié. + +Premièrement, penser à supprimer la tâche cron par défaut de certbot qui est lancé en root : +~~~ +rm /etc/cron.d/certbot +~~~ + +Ensuite créer l'utilisateur dédié à certbot (ici "acme") et corriger les droits en consequences : +~~~ +useradd acme -d /etc/letsencrypt +mkdir /etc/letsencrypt /var/log/letsencrypt /var/lib/letsencrypt +chmod 755 /etc/letsencrypt /var/log/letsencrypt /var/lib/letsencrypt +chown acme: /etc/letsencrypt /var/log/letsencrypt /var/lib/letsencrypt +~~~ + +Puis ajouter la commande de renouvellement dans la crontab de l'utilisateur acme : +~~~ +# On ouvre la crontab de acme +crontab -u acme -e +# Et on rajoute la ligne suivante +0 0,12 * * * certbot renew -q +~~~ + +### Configuration du Serveur Web + +#### Apache + +Créer le fichier dans /etc/apache2/conf-available/letsencrypt.conf avec : +~~~ +SetEnvIf Request_URI "/.well-known/acme-challenge/*" no-jk +Alias /.well-known/acme-challenge /var/lib/letsencrypt/.well-known/acme-challenge + + Options -Indexes + AllowOverride all + Require all granted + +~~~ +Puis activer ce fichier : +~~~ +ln -s /etc/apache2/conf-available/letsencrypt.conf /etc/apache2/conf-enabled/letsencrypt.conf +apache2ctl -t +service apache2 reload +~~~ + +### Génération du certificat + +Générér une clé SSL dans /etc/ssl/private et un CSR (voir [HowtoSSL](http://trac.evolix.net/infogerance/wiki/HowtoSSL)) : +~~~ +openssl req -newkey rsa:2048 -sha256 -nodes -keyout /etc/ssl/private/ma-cle.ssl -out mon-csr.csr +~~~ + +Faire la demande de certificat (avec l'utilisateur acme, le csr doit être accesible en lecture à cet utilisateur) : +~~~ +sudo -u acme certbot certonly --webroot --csr mon-csr.csr --webroot-path /var/lib/letsencrypt -n --agree-tos --cert-path=/etc/letsencrypt/mon-cert.crt --fullchain-path=/etc/letsencrypt/mon-cert-fullchain.pem --chain-path=/etc/letsencrypt/mon-cert-chain.pem email@example.com +~~~ + +Votre certificat est maintenant présent dans /etc/letsencrypt/mon-cert.crt ! + +## Automatisation + +Pour simplifier l'installation et la configuration de certbot ainsi que la génération de CSR et de certificat, Evolix à créé le projet [Evoacme](https://forge.evolix.org/projects/ansible-roles/repository/revisions/master/show/evoacme). + + \ No newline at end of file diff --git a/HowtoLibreOffice.md b/HowtoLibreOffice.md new file mode 100644 index 00000000..5b4cf656 --- /dev/null +++ b/HowtoLibreOffice.md @@ -0,0 +1,24 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto LibreOffice + +Gestion des imprimantes : + +~~~ +$ /usr/lib/libreoffice/program/spadmin +~~~ + +## headless + +Debian 8 : + +~~~ +# aptitude install libreoffice-writer openjdk-7-jre-headless +~~~ + +### FAQ + +Q : En tant qu'utilisateur, je lancer des commande "libreoffice --headless" mais je n'ai pas de résultat. + +R : vérifier les droits de /var/spool/libreoffice (notamment le répertoire de cache) + diff --git a/HowtoLiveCD.md b/HowtoLiveCD.md new file mode 100644 index 00000000..bc4cefcf --- /dev/null +++ b/HowtoLiveCD.md @@ -0,0 +1,117 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Live-CD + +Un Live-CD est un CD-ROM ou DVD-ROM contenant un système (souvent GNU/Linux) pouvant +être démarré sans toucher au(x) système(s) déjà installé(s) sur l'ordinateur. + +## Graver un Live-CD + +1. Il faut télécharger un fichier .iso + +Par exemple : + +DEBIAN : [] + +Kubuntu : [] + +2. Il faut ensuite le graver : + +ATTENTION, il ne faut pas graver un CD-ROM contenant le fichier .iso MAIS le fichier .iso est un format spécial +contenant des données préparées pour être gravée ! Sous Windows, il faut donc "Ouvrir" le fichier .iso avec un +logiciel de gravure (du type Nero Burning Room) et non pas créer un nouveau CD-ROM contenant le .iso. +Une fois gravé, on obtiendra un CD-ROM contenant plusieurs répertoires/fichiers, et non pas un CD-ROM +contenant le fichier .iso + +Sous Windows, il faut utiliser votre logiciel de gravure. Il doit être compatible avec les fichiers .ISO (vérifier +sur votre moteur de recherche préféré). Faites ensuite un clic droit sur le fichier .iso puis "Ouvrir avec" et choisissez +votre logiciel de gravure. Puis gravez ! + +Sous Linux : + +~~~ +$ wodim debian-live-6.0.5-amd64-standard.iso +~~~ + +Voir aussi : [] + +## Démarrer sur un Live-CD + +Insérer le CD-ROM dans le lecteur de l'ordinateur, puis démarrer la machine. + +Si cela ne démarre pas tout seul sur le Live-CD, vous devez soit : + +* Presser une touche permettant de choisir le périphérique d'amorçage + +* Configurer les _Boot Options_ dans le BIOS pour que le démarrage via CD-ROM se fasse avant le démarrage sur le disque interne. + +## Et une fois démarré ? + +Vous devez obtenir un accès root sans trop de difficultés (souvent un terminal avec une invite de commande se terminant par #) : + +~~~ +# +~~~ + +Actions typiques qui peuvent être utiles : + +### Ouvrir un accès distant via SSH + +Vous devez faire la configuration IP, positionner un mot de passe et démarrer le service SSH : + +~~~ +# ifconfig eth0 IP/masque +# passwd +# /etc/init.d/ssh start +~~~ + +### restaurer LILO ou GRUB + +Vous devez vous "chrooter" sur le système de base (changer les noms de partitions selon votre ordianteur) : + +~~~ +# mkdir /chroot +# mount /dev/sda2 /chroot/ +# mount /dev/sda1 /chroot/boot +# mount /dev/sda5 /chroot/usr +# mount /dev/sda3 /chroot/var +# mount -t proc /proc /chroot/proc +# mount -o bind /dev /chroot/dev +# mount -o bind /dev/pts /chroot/dev/pts +# mount -o bind /sys /chroot/sys +# chroot /chroot /bin/bash +~~~ + +Remarque : à noter la variante en cas de partition chiffrée ([]) +~~~ +# mount /dev/sda2 /chroot/ +~~~ +devient +~~~ +# cryptsetup luksOpen /dev/sda2 sda2crypt +# mount /dev/mapper/sda2crypt /chroot/ +~~~ + + +Vous voilà donc plus ou moins comme si vous étiez sur votre Linux local. Vous pouvez ensuite lancer une restauration +de LILO ou GRUB qui va se réinstaller dans le MBR de votre disque dur : + +~~~ +# lilo -v +~~~ + +ou + +~~~ +# grub-install /dev/sda +# update-grub2 +~~~ + + +## FAQ + +### J'ai un multiboot UEFI et je veux restaurer GRUB car je n'arrive plus à démarrer sous Linux + +Vous avez probablement écraser votre partition UEFI avec une mise-à-jour Windows. +Via Live-CD vous devez simplement monter en RW (il faut parfois le forcer) votre partition UEFI dans /boot/efi avant de faire votre grub-install. +Évidemment, vous devez avoir les paquets grub-efi installés. diff --git a/HowtoLog2mail.md b/HowtoLog2mail.md new file mode 100644 index 00000000..c6c4e953 --- /dev/null +++ b/HowtoLog2mail.md @@ -0,0 +1,94 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto log2mail + +Pour surveiller précisement un fichier journal et recevoir des alertes par mail +si certains termes apparaissent dans ce fichier, vous pouvez utiliser le +logiciel *log2mail*. + +## Configuration + +Sa configuration se déroule dans le fichier _/etc/log2mail/config/default_. +Par exemple, si vous voulez préciser que vous voulez recevoir un mail dès que le terme _fatal_ +apparaît dans le fichier _/var/log/mail.log_, ajoutez ces lignes : + +~~~ +file = /var/log/mail.log +pattern = "fatal" +mailto = admin@example.com +template = /etc/log2mail/template.mail-fatal +~~~ + +Dans ce cas, on devra avoir un fichier +_/etc/log2mail/template.mail-fatal_ qui définit la structure +du mail qui sera envoyé. Voici un exemple simple : + +~~~ +From: %f +To: %t +Subject: [LOG2MAIL] Erreur fatale pour mail.log + +Bonjour, + +Nous avons reconnu le terme "%m" dans "%F" %n fois : +%l + +Merci. +~~~ + +Attention, log2mail est un logiciel assez basique... et il plante +si il n'a pas les droits d'accès à un fichier déclaré dans sa configuration, +il plante !! On prendra donc bien garde +Pour des logs système, on devra ainsi souvent faire : + +~~~ +# adduser log2mail adm +~~~ + +Après toutes modifications, il ne faut pas oublié de redémarrer le deamon: + +~~~ +/etc/init.d/log2mail restart +~~~ + +Et vérifié le process avec ps aux: + +~~~ +ps aux |grep log2mail +~~~ + + +## Configuration avancée + +log2mail détecte les _pattern_ avec le code suivant (ligne 25 de data.cc) : + +~~~ +int inPattern::matches(const string& aLine) { + return (regexec(&rPattern, aLine.c_str(), 0, 0, 0) == 0); +} +~~~ + +D'après le man de regexec(3) : + +~~~ + POSIX Regex Matching + regexec() is used to match a null-terminated string against the precom? + piled pattern buffer, preg. nmatch and pmatch are used to provide + information regarding the location of any matches. eflags may be the + bitwise-or of one or both of REG_NOTBOL and REG_NOTEOL which cause + changes in matching behavior described below. +~~~ + +On peut donc utiliser les [regex POSIX](http://en.wikipedia.org/wiki/Regular_expression#POSIX) + +Voici quelques exemples testés : + +~~~ +# N'importe quelle ligne +pattern = ".*" +# Debut de ligne +pattern = "^ERROR" +~~~ + +Pour une configuration très avancée, on pourra astucieusement utiliser _procmail_ pour +faire un filtrage encore plus fin des alertes. \ No newline at end of file diff --git a/HowtoLogcheck.md b/HowtoLogcheck.md new file mode 100644 index 00000000..dfed6072 --- /dev/null +++ b/HowtoLogcheck.md @@ -0,0 +1,71 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Logcheck + +[Logcheck](http://logcheck.org/) est un outil qui permet d'envoyer les logs par mail, plus précisément les lignes inconnues (non répertoriées dans ses règles) trouvées dans certains journaux. + +## Installation + +Sous Debian, on l'installera via : + +~~~ +# aptitude install logcheck logcheck-database +~~~ + +## Configuration + +Par défaut, Logcheck va lire les journaux suivants dans /var/log/ : syslog, auth.log, mail.log, cron.log et user.log (voir dans _/etc/logcheck/logcheck.logfiles_). + +Sa configuration se passe dans le fichier _/etc/logcheck/logcheck.conf_ où l'on précisera principalement REPORTLEVEL (pour choisir quel jeu d'exceptions l'on veut utiliser), +et bien sûr SENDMAILTO qui précise à qui doit être envoyé les résultats. + +~~~ +REPORTLEVEL="server" +SENDMAILTO="OMG@example.com" +MAILASATTACH=0 +FQDN=1 +TMP="/tmp" +~~~ + +## Utilisation + +Logcheck s'exécute toutes les heures et à chaque reboot... et on est souvent rebuté par la quantité de logs reçus. Pourtant, le but est bien de ne *rien* recevoir sauf exception ! +Pour cela, il est important de passer par une "phase de test" où l'on ajoutera des règles d'exception pour prendre en compte les particularités de son système. + +Par exemple, si vous utilisez le _REPORTLEVEL="server"_ vous ajouterez des expressions régulières dans un fichier situé dans le répertoire _ignore.d.server/_. +Voici par exemple, quelques règles que l'on a pu ajouter pour diverses raisons : + +~~~ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ kernel: \[IPTABLES DROP\] : IN=eth0 OUT= MAC=.* +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ log2mail\[[0-9]+\]: Logfile [.[:alnum:]/]+ rotated. Listening to new file.$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ nrpe\[[0-9]+\]: Could not read request from client, bailing out...$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ nrpe\[[0-9]+\]: INFO: SSL Socket Shutdown.$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ ntpd\[[0-9]+\]: clock is now [[:alnum:]]+$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ suhosin\[[0-9]+\]: ALERT - Include filename \([^)]+\) is an URL that is not allowed \(attacker.+$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ suhosin\[[0-9]+\]: ALERT - tried to register forbidden variable '_REQUEST' through POST variables \(attacker.+$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ suhosin\[[0-9]+\]: ALERT - tried to register forbidden variable '_GET' through POST variables \(attacker.+$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ suhosin\[[0-9]+\]: ALERT - tried to register forbidden variable '_SERVER\[\w+\]' through POST variables \(attacker.+$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ suhosin\[[0-9]+\]: ALERT - ASCII-NUL chars not allowed within request variables.+$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ proftpd\[[0-9]+\]: [._[:alnum:]-]+ - ProFTPD killed \(signal 15\)$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ proftpd\[[0-9]+\]: [._[:alnum:]-]+ - ProFTPD 1.3.1 standalone mode SHUTDOWN$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ proftpd\[[0-9]+\]: [._[:alnum:]-]+ - ProFTPD 1.3.1 \(stable\) \(built Tue Oct 27 10:09:08 UTC 2009\) standalone mode STARTUP$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ rsyncd\[[0-9]+\]: connect from [._[:alnum:]-]+ \([.[0-9]]+\)$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ rsyncd\[[0-9]+\]: rsync allowed access on module [a-z]+ from [._[:alnum:]-]+ \([.[0-9]]+\)$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ rsyslogd: -- MARK --$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ rsyslogd: \[origin software="rsyslogd" swVersion="3.18.6" x-pid="[0-9]+" x-info="] restart$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ sshd\[[0-9]+\]: Received disconnect from [.[0-9]]+: 11:.*$ +~~~ + +Pour tester une expression régulière que l'on écrit, on utilisera "egrep" ainsi : + +~~~ +$ sed -e 's/[[:space:]]*$//' /var/log/syslog | egrep 'MA-SUPER-EXPRESSION-REGULIERE' +~~~ + +On peut aussi faire un petit tour sur rubular.com + +Si on pourra aussi faire tout simplement : + +~~~ +$ echo "Oct 8 23:59:33 foo sshd[24123]: Received disconnect from 192.0.2.51: 11: disconnected by user" | egrep 'MA-SUPER-EXPRESSION-REGULIERE' +~~~ diff --git a/HowtoLogrotate.md b/HowtoLogrotate.md new file mode 100644 index 00000000..a0219ea4 --- /dev/null +++ b/HowtoLogrotate.md @@ -0,0 +1,42 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +Logrotate est un programme qui permetde gérer la croissance et l'historique des fichiers de logs. + +# Principe général + +Le programme est exécuté régulièrement, avec un fichier de configuration en paramètre. + +Par défaut, c'est `/etc/logrotate.conf` qui habituellement charge toutes les configurations présentes dans `/etc/logrotate.d/` + +Les paquets des progammes qui génèrent des logs (par exemple Apache, Postfix, ...) fournissent généralement une configuration pour logrotate. + + +# Stratégie de gestion + +Il y a de très nombreuses stratégies de gestion des logs, en voici quelques unes illustrées. + +cf. + +## Applications Ruby + +Pour les serveurs d'application comme Puma, Unicorn, ... : + +~~~ +/home/USER/apps/production/*/shared/log/*.log { + su USER GROUP + weekly + missingok + rotate 52 + compress + delaycompress + notifempty + dateext + dateformat .%Y-%m-%d + dateyesterday + copytruncate +} +~~~ + +Cette stratégie va faire une rotation hebdomadaire, conserver 52 semaines (1 an), compresser les logs passés après les avoir datés. + +L'instruction `copytruncate` est importante car le descripteur de fichier ouvert par l'application ne va pas changer. \ No newline at end of file diff --git a/HowtoLsyncd.md b/HowtoLsyncd.md new file mode 100644 index 00000000..ad9c363a --- /dev/null +++ b/HowtoLsyncd.md @@ -0,0 +1,42 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto LSyncD + + + +## Installation + +A partir de Debian Squeeze. + +~~~ +# aptitude install lsyncd +~~~ + +## Utilisation en ligne de commande + +~~~ +lsyncd --no-daemon /repertoire/a/syncroniser user@host:/repertoire/dans/lequel/syncroniser +~~~ + +## Lancement en tant que daemon + +Il suffit d'appeler lsyncd avec le paramètre --conf et le chemin du fichier de configuration que l'on souhaite utiliser : + +~~~ +lsyncd --conf /home/user/blah/fichier +~~~ + +Le fichier de configuration : + +~~~ + + + + + + + + + + +~~~ \ No newline at end of file diff --git a/HowtoMHonArc.md b/HowtoMHonArc.md new file mode 100644 index 00000000..6d742fac --- /dev/null +++ b/HowtoMHonArc.md @@ -0,0 +1,12 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto MHonArc + +Pour générer des pages HTML à partir d'une Maildir : + +~~~ +$ mv MAILDIR/new MAILDIR/cur +$ mhonarc -mhpattern '^[^\.]' MAILDIR/cur +~~~ + + \ No newline at end of file diff --git a/HowtoMail/Amavis.md b/HowtoMail/Amavis.md new file mode 100644 index 00000000..d498b4ee --- /dev/null +++ b/HowtoMail/Amavis.md @@ -0,0 +1,147 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Howto Amavis + +~~~ +# apt install amavisd-new arc arj zoo pax bzip2 cabextract rpm lzop clamav-daemon +~~~ + +La configuration se trouve dans _/etc/amavis/conf.d/_ et se modifie/surcharge (autant que possible) dans le fichier _50-user_. +Voici les directives que l'on pourra modifier : + +~~~ +# Correction d'un bug sous Lenny +$mailfrom_notify_admin = "postmaster\@$mydomain"; +$mailfrom_notify_recip = "postmaster\@$mydomain"; +$mailfrom_notify_spamadmin = "postmaster\@$mydomain"; + +# Liste des domaines considérés comme locaux +#@local_domains_acl = qw(.); +@local_domains_acl = (".example.net","example.com"); + +# On customise la ligne ajoutée dans les entêtes +$X_HEADER_LINE = "by Amavis at $mydomain"; + +# Notifications de fichiers bannis / virus +$virus_admin = "postmaster\@$mydomain"; + +# Pour recevoir des bounces (mails originals) des fichiers bloqués / virus +#$banned_quarantine_to = "banned\@$mydomain"; +#$virus_quarantine_to = "virus\@$mydomain"; + +# Note tueuse +$sa_tag2_level_deflt = 6.31; +# Pour un comportement "normal" de SA +$sa_tag_level_deflt = -1999; +$sa_kill_level_deflt = 1999; +$sa_dsn_cutoff_level = -99; +$sa_spam_subject_tag = '[SPAM]'; + +# log +$log_level = 2; + +# En fonction besoin/ressources, on a juste le nbre de process +$max_servers = 10; + +~~~ + +Le comportement des notifications par défaut est de : + +* notifier l'expéditeur (?) et $virus_admin lors de la présence d'un fichier banni, mail non délivré +* notifier $virus_admin lors de la présence d'un virus, mail non délivré +* Évidemment pour les spams, personne n'est notifié + +Note : Si le domaine de l'expéditeur est dans @local_domains_acl, alors l'expéditeur est toujours notifié ! + +Pour activer l'antivirus et/ou l'antispam, on décommentera les lignes adéquats dans le fichier _15-content_filter_mode_... + +Avant d'activer l'antivirus ClamAV, on ajoutera l'utilisateur _clamav_ dans le groupe _amavis_ pour autoriser clamd à lire dans /var/lib/amavis +et l'inverse pour autoriser amavisd à lancer clamscan (et lire dans /var/lib/clamav) : + +~~~ +# adduser clamav amavis +# adduser amavis clamav +~~~ + +Il faut aussi modifier ce paramètre dans /etc/clamav/clamd.conf : + +~~~ +AllowSupplementaryGroups true +~~~ + +Pour activer Amavis avec Postfix, on ajoutera dans le fichier _master.cf_ : + +~~~ +smtp-amavis unix - - y - 2 lmtp + -o lmtp_data_done_timeout=1200 + -o lmtp_send_xforward_command=yes + +127.0.0.1:10025 inet n - y - - smtpd + -o content_filter= + -o local_recipient_maps= + -o relay_recipient_maps= + -o smtpd_restriction_classes= + -o smtpd_delay_reject=no + -o smtpd_client_restrictions=permit_mynetworks,reject + -o smtpd_helo_restrictions= + -o smtpd_sender_restrictions= + -o smtpd_recipient_restrictions=permit_mynetworks,reject + -o smtpd_data_restrictions=reject_unauth_pipelining + -o smtpd_end_of_data_restrictions= + -o mynetworks=127.0.0.0/8 + -o strict_rfc821_envelopes=yes + -o smtpd_error_sleep_time=0 + -o smtpd_soft_error_limit=1001 + -o smtpd_hard_error_limit=1000 + -o smtpd_client_connection_count_limit=0 + -o smtpd_client_connection_rate_limit=0 + -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks + +pre-cleanup unix n - n - 0 cleanup + -o virtual_alias_maps= + -o canonical_maps= + -o sender_canonical_maps= + -o recipient_canonical_maps= + -o masquerade_domains= + -o always_bcc= + -o sender_bcc_maps= + -o recipient_bcc_maps= +~~~ + +Pour éviter les doublons, il est conseillé d'ajouter l'option _-o cleanup_service_name=pre-cleanup_ +aux services _smtp_, _cleanup_, _submission_ et _smtps_. + +Et dans _main.cf_ : + +~~~ +content_filter = smtp-amavis:[127.0.0.1]:10024 +~~~ + +### Ressortir un mail de quarantaine + +Lorsqu'un mail est mis en quarantaine, amavisd logue un message du style : +~~~ +amavis[31262]: (31262-05) Blocked BANNED [...] quarantine: 5/banned-5VspXCi2iNIn, [...] +~~~ + +Pour le ressortir de la quarantaine et le renvoyer au destinataire : +~~~ +# amavisd-release 5/banned-5VspXCi2iNIn +~~~ + +#### Erreur "Can't connect to UNIX socket" + +Il est possible que la chaussette d'Amavis soit située dans /var/run à la place de /var/lib, dans ce cas il suffit de modifier la socket dans /etc/amavis/conf.d/25-amavis_helpers : + +~~~ +$unix_socketname = "/var/lib/amavis/amavisd.sock"; +~~~ + +### Whitelister une adresse mail + +Rajouter ceci dans le fichier _/etc/amavis/conf.d/50-user_ : +~~~ +@whitelist_sender_maps = ( new_RE( + qr'jdoe@example.com$'i, +)); +~~~ diff --git a/HowtoMail/Antispam.md b/HowtoMail/Antispam.md new file mode 100644 index 00000000..f4f6d3d2 --- /dev/null +++ b/HowtoMail/Antispam.md @@ -0,0 +1,786 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto antispam + + + +Le spam est un message électronique non sollicité. +C'est devenu un fléau moderne, au même titre que les virus informatiques ou les attaques DDOS, +qui arrange bien des industriels... + +## Les outils de base + +Sous Debian 7, on a : + +* Postfix 2.9.6 +* SpamAssassin 3.3.2 +* Amavisd-new 2.7.1 +* ClamAV 0.98.4 +* Postgrey 1.34 + +Sous Debian 8, on a : + +* Postfix 2.11.3 +* SpamAssassin 3.4.0 +* Amavisd-new 2.10.1 +* ClamAV 0.98.7 +* Postgrey 1.35 + +~~~ +# aptitude install postfix spamassassin amavisd-new clamav-daemon postgrey +~~~ + +## Les principes de base + +Si un utilisateur détecte d'un coup d'œil si un message est un spam ou non... c'est compliqué d'automatiser cette décision par un ordinateur. +Voici les principes qui sont généralement mis en œuvre : + +* Vérification de l'adresse email de l'expéditeur +* Vérification de l'adresse IP de l'expéditeur +* Vérification des entêtes et du contenu du message +* Vérification des pièces jointes +* Vérification des éventuelles signatures (DKIM) +* Vérification du client SMTP qui transmet le message + +Au niveau d'un serveur, un ensemble d'outils vont se charger de ces vérifications. +On distingue souvent : + +* Les filtres de 1er niveau : vérifications *avant* d'accepter un message par le serveur SMTP +* Les filtres de 2ème niveau : vérifications *après* l'avoir accepté mais *avant* de délivrer dans la boîte de l'utilisateur +* Les filtres de 3ème niveau : vérifications faites par l'utilisateur (antivirus sur son poste, filtres sur son client POP/IMAP) => non traité dans ce Howto + +## Postfix + + + +Postfix est un serveur SMTP. Il est la base d'un antispam car c'est lui qui reçoit les messages via le protocole SMTP. + +Il permet déjà un grand nombre de vérifications basiques : + +* rejet à partir d'une liste "statique" d'adresses email / d'adresses IP +* rejet à partir de termes simples dans les entêtes et le contenu +* rejet des noms de domaine inexistants ou invalides utilisés dans l'adresse email de l'expéditeur +* rejet des adresses IP qui ont un reverse DNS inexistant ou invalide +* rejet à partir d'une RBL + +Voici un exemple de restrictions à mettre dans le main.cf : + +~~~ +# Restrictions selon l'IP +smtpd_client_restrictions = permit_mynetworks, + permit_sasl_authenticated, + reject_rbl_client clients.rbl.gcolpart.com, + cidr:/etc/postfix/spamd.cidr, + permit + +# Exiger la commande HELO/EHLO +smtpd_helo_required = yes + +# Restrictions au niveau de la commande HELO/EHLO +smtpd_helo_restrictions = reject_invalid_hostname + +# Restrictions au niveau de la commande MAIL FROM +smtpd_sender_restrictions = permit_mynetworks, + check_sender_access hash:/etc/postfix/sa-blacklist.access, + permit + +# Restrictions au niveau de la commande RCPT TO +smtpd_recipient_restrictions = permit_mynetworks, + permit_sasl_authenticated, + reject_unauth_destination, + check_client_access hash:/etc/postfix/client.access_local, + check_client_access hash:/etc/postfix/client.access, + check_sender_access hash:/etc/postfix/sender.access_local, + check_sender_access hash:/etc/postfix/sender.access, + check_recipient_access hash:/etc/postfix/recipient.access_local, + check_recipient_access hash:/etc/postfix/recipient.access, + reject_unlisted_recipient, + reject_unknown_sender_domain, + reject_non_fqdn_sender, + reject_unauth_pipelining, + permit + +# Restrictions au niveau de la commande DATA +smtpd_data_restrictions = permit + +# Restrictions au niveau de la commande ETRN +smtpd_etrn_restrictions = reject + +# Filtrage des entetes +header_checks = regexp:/etc/postfix/header_kill_local, regexp:/etc/postfix/header_kill + +# Filtrage du contenu +body_checks = regexp:/etc/postfix/body_kill_local, regexp:/etc/postfix/body_kill + +~~~ + +Cette configuration suppose avec des "maps" locales vides : + +~~~ +# touch /etc/postfix/client.access_local +# postmap /etc/postfix/client.access_local +# touch /etc/postfix/sender.access_local +# postmap /etc/postfix/sender.access_local +# touch /etc/postfix/recipient.access_local +# postmap /etc/postfix/recipient.access_local +# touch /etc/postfix/header_kill_local +~~~ + +Cela suppose aussi de récupérer des maps gérées par Evolix à l'aide d'un script spam.sh : + +~~~ +#!/bin/bash + +# debug +#set -x + +umask 022 + +tmp_file=$(mktemp) + +tmp=$(mktemp -d) + +cd $tmp + +if [ -f $tmp_file ] ; + then rm $tmp_file ; +fi + +cd /var/tmp + +sleep $[ $RANDOM / 1024 ] + +wget -q -t 3 -O $tmp_file +cp $tmp_file /etc/postfix/client.access +rm $tmp_file + +wget -q -t 3 -O $tmp_file +cp $tmp_file /etc/postfix/sender.access +rm $tmp_file + +wget -q -t 3 -O $tmp_file +cp $tmp_file /etc/postfix/recipient.access +rm $tmp_file + +wget -q -t 3 -O $tmp_file +cp $tmp_file /etc/postfix/header_kill +rm $tmp_file + +wget -q -t 3 -O sa-blacklist.access +wget -q -t 3 -O $tmp_file +if md5sum -c $tmp_file > /dev/null && [ -s sa-blacklist.access ] ; then + cp sa-blacklist.access /etc/postfix/sa-blacklist.access +fi +rm sa-blacklist.access +rm $tmp_file + +/usr/sbin/postmap hash:/etc/postfix/client.access +/usr/sbin/postmap hash:/etc/postfix/sender.access +/usr/sbin/postmap hash:/etc/postfix/recipient.access +/usr/sbin/postmap -r hash:/etc/postfix/sa-blacklist.access + +wget -q -t 3 -O spamd.cidr +wget -q -t 3 -O $tmp_file +if md5sum -c $tmp_file > /dev/null && [ -s spamd.cidr ] ; then + cp spamd.cidr /etc/postfix/spamd.cidr +fi +rm spamd.cidr +rm $tmp_file +rm -rf $tmp + +~~~ + + +### Postscreen + + + +Postscreen est un démon de Postfix qui permet de renforcer les filtres de 1er niveau. +Il permet principalement de combiner la vérification auprès de plusieurs RBL. +Avec l'option "reject_rbl_client", Postfix vérifie la présence d'une IP auprès de plusieurs RBLs : si l'IP est présente au moins une fois, Postfix rejette le message. +Postscreen permet de ne rejeter le message que si l'adresse IP est présente au moins N fois. + +### Postgrey + + + + +Postgrey fait du Greylisting : il retarde volontairement un message reçu pour vérifier le client SMTP qui envoie le message. +Cela a une certaine efficacité, d'autant plus que cela permet de faire d'autres vérifications plus tard... qui seront de meilleures qualité car plus à jour ! + +Mais si l'on fait cela pour tous les messages reçus, la plupart des messages seront retardés de quelques minutes... ou heures. +Souvent, on ne tolère donc pas une activation globale du Greylisting. +Cela reste néanmoins intéressant : on peut s'en servir pour retarder des messages incertains et attendre d'avoir des vérifications de meilleure qualité. + +### Whitelister + + + +Whitelister est un logiciel écrit en OCAML par Pierre Habouzit. +Il permet de faire du Greylisting conditionnel, c'est-à-dire qu'il permet de ne faire du Greylist que si l'adresse IP est louche. +Pour cela il teste principalement sa présence dans des RBL : si elle est listée par au moins une RBL, le message est greylisté ! + +~~~ +# aptitude install whitelister postgrey +~~~ + +Dans `/etc/whitelister.conf` : + +~~~ +sock: /var/spool/postfix/private/whitelister.ctl + +rbl: zen.spamhaus.org +rbl: bl.spamcop.net +rbl: b.barracudacentral.org +rbl: cbl.abuseat.org +rbl: dnsbl.sorbs.net +rbl: ix.dnsbl.manitu.net +rbl: psbl.surriel.com +rbl: truncate.gbudb.net +rbl: dnsbl-1.uceprotect.net +rbl: db.wpbl.info +rbl: all.spamrats.com +rbl: bl.spamcannibal.org +rbl: block.stopspam.org +rbl: badhost.stopspam.org +rbl: dnsbl.stopspam.org +rbl: dul.pacifier.net +rbl: dnsbl.dronebl.org +rbl: dnsbl.inps.de +rbl: bl.blocklist.de +rbl: srnblack.surgate.net +rbl: all.s5h.net +rbl: rbl.megarbl.net +rbl: bl.score.senderscore.com +rbl: rbl.rbldns.ru +rbl: dnsbl.cobion.com +rbl: bl.mailspike.net +rbl: cidr.bl.mcafee.com +rbl: dnsblchile.org +rbl: aspews.ext.sorbs.net +rbl: l2.spews.dnsbl.sorbs.net + +rhbl_client: dsn.rfc-clueless.org +rhbl_client: postmaster.rfc-clueless.org +rhbl_client: abuse.rfc-clueless.org +rhbl_client: whois.rfc-clueless.org +rhbl_client: bogusmx.rfc-clueless.org + +rhbl_sender: dsn.rfc-clueless.org +rhbl_sender: postmaster.rfc-clueless.org +rhbl_sender: abuse.rfc-clueless.org +rhbl_sender: whois.rfc-clueless.org +rhbl_sender: bogusmx.rfc-clueless.org + +rhbl_helo: dsn.rfc-clueless.org +rhbl_helo: postmaster.rfc-clueless.org +rhbl_helo: abuse.rfc-clueless.org +rhbl_helo: whois.rfc-clueless.org +rhbl_helo: bogusmx.rfc-clueless.org + +dns_client: 1 +dns_rev_client: 1 +~~~ + +Ajouter la ligne à la directive `smtpd_recipient_restrictions` du fichier `/etc/postfix/main.cf` : + +~~~ +check_policy_service unix:private/whitelister.ctl check_policy_service inet:127.0.0.1:60000, +~~~ + +Puis redémarrer Postfix. + + +## RBL : Realtime Blackhole List + +Une RBL est un système permet de vérifier la présence d'adresses IP, de noms de domaine, etc. dans une base mise à jour très régulièrement. +La plupart du temps, son interrogation fonctionne via les DNS. + +### DNS RBL pour les adresses IP + + + +Les RBLs pour IP permettent de vérifier si une adresse IP est légitime pour envoyer des emails. + +Par exemple, pour vérifier si une adresse IP est légitime : + +~~~ +$ dig +short 2.26.171.202.clients.rbl.gcolpart.com +127.0.0.2 => NON LÉGITIME +$ dig +short 8.8.8.8.clients.rbl.gcolpart.com +~~~ + +Il existe de très nombreuses RBLs pour IP... le problème est leur fiabilité et leur politique pour en sortir. + +Voici une liste de RBLs que nous utilisons (août 2015) : + +||RBL||notre confiance||lien (optionnel)|| +||clients.rbl.gcolpart.com||100%|| +||zen.spamhaus.org||90%|| +||bl.spamcop.net||90%|| +||b.barracudacentral.org||80%|| +||cbl.abuseat.org||80%|| +||bl.score.senderscore.com||80%|| +||hostkarma.junkemailfilter.com (127.0.0.2)||80%|| +||dnsbl.sorbs.net||70%|| +||ix.dnsbl.manitu.net||60%|| +||psbl.surriel.com||50%|| +||truncate.gbudb.net||50%|| +||dnsbl-1.uceprotect.net||50%|| +||db.wpbl.info||50%|| +||all.spamrats.com||50%|| +||dnsbl.dronebl.org||50%|| +||dnsbl.inps.de||50%|| +||bl.blocklist.de||50%|| +||srnblack.surgate.net||50%|| +||all.s5h.net||50%|| +||rbl.megarbl.net||50%|| +||dnsbl.cobion.com||50%|| +||bl.mailspike.net||50%|| +||cidr.bl.mcafee.com||50%|| +||bl.spamcannibal.org||40%|| +||hostkarma.junkemailfilter.com (127.0.0.4)||40%|| +||work.drbl.gremlin.ru||40%|| +||aspews.ext.sorbs.net||20%|| +||l2.spews.dnsbl.sorbs.net||10%|| ?|| +||rbl.rbldns.ru||10%|| +||dnsblchile.org||10%|| +||dnsbl.stopspam.org||0%|| +||dnsbl.proxybl.org||0%|| +||pbl.spamhaus.org||N/A|| + + +### RBL pour les domaines expéditeur / HELO + + est particulier, cela liste tous les domaines qui ne respectent pas les RFC, y compris GMAIL & co :) + +### URIBL : les RBLS pour les URI / noms de domaines + +Les RBLs pour URI permettent de vérifier si un nom de domaine est légitime, principalement pour les liens dans le contenu des emails. + +Par exemple, pour vérifier si un domaine est légitime : + +~~~ +$ dig +short cryptolocker.com.multi.uribl.com +127.0.0.2 => NON LÉGITIME +$ dig +short example.com.multi.uribl.com +~~~ + +* multi.uribl.com : +* dbl.spamhaus.org : +* multi.surbl.org : +* hostkarma.junkemailfilter.com : +* public.sarbl.org : +* dnsbl.invaluement.com : (payant) + +## Vérifications via SPF + + + +L'idée est de rejetter un mail qui a un enregistrement SPF invalide. On utilise pour cela un programme en python `postfix-policyd-spf-python` (dispo dans les packages Debian). + +La configuration se fait dans /etc/postfix-policyd-spf-python/policyd-spf.conf, on peut se servir de la version commenté : /usr/share/doc/postfix-policyd-spf-python/policyd-spf.conf.commented, c'est celle que l'on va utiliser. + + +~~~ +# cp /usr/share/doc/postfix-policyd-spf-python/policyd-spf.conf.commented /etc/postfix-policyd-spf-python/policyd-spf.conf +~~~ + +Paramètres intéressants : + +~~~ +defaultSeedOnly = 0 # Mode simulation, aucun rejet, seulement la description de l'action dans les logs. +Mail_From_reject = Fail # Rejete les mails si le check SPF échoue. +Mail_From_reject = Softfail # Rejete les mails si le check SPF échoue même en « soft » (utilisation de ~all par exemple), non recommandé. +Reject_Not_Pass_Domains = aol.com,hotmail.com # Transoforme un ~all en -all pour des domaines en particuliers. +~~~ + +Pour l'activer, modifications dans /etc/postfix/master.cf et /etc/postfix/main.cf : + +master.cf: + +~~~ +policyd-spf unix - n n - 0 spawn + user=policyd-spf argv=/usr/bin/policyd-spf +~~~ + + +main.cf : + +~~~ + +smtpd_recipient_restrictions = + ... + reject_unauth_destination + check_policy_service unix:private/policyd-spf + ... +policyd-spf_time_limit = 3600 +~~~ + +Un redémarrage de postfix sera nécessaire. + + +## Vérification via DKIM + + + +Il suffit d'installer `opendkim` et d'indiquer sur quel port se binder dans opendkim et postfix. + +/etc/opendkim.conf + +~~~ +Socket inet:54321@localhost +# On veut loguer les actions. +LogResults true +LogWhy true +~~~ + +Attention, par défaut `opendkim` fait certaines requêtes sans utiliser le resolver local... +ce qui peut provoquer des ralentissements si cela n'est pas autorisé au niveau firewall. Il faut alors désactiver : + +~~~ +DisableADSP true +~~~ + + +/etc/postfix/main.cf + +~~~ +smtpd_milters = inet:127.0.0.1:54321 +non_smtpd_milters = inet:127.0.0.1:54321 +# Par défaut, un mail avec une signature non valide sera rejeté en 4xx. +# milter_default_action=accept +~~~ + +## Vérification via DMARC + + + + +## SpamAssassin + + + + +Exemple de local.cf : + +~~~ +required_score 5 +report_safe 0 +rewrite_header Subject [SPAM] +add_header all Report _REPORT_ + +# filtre bayesien +# mkdir -p /var/spool/spam +use_bayes 1 +bayes_auto_learn 1 +bayes_path /var/spool/spam/bayes +bayes_file_mode 0777 + +# AWL : AutoWhitelist +# mkdir -p /var/spool/spam +loadplugin Mail::SpamAssassin::Plugin::AWL +use_auto_whitelist 1 +auto_whitelist_path /var/spool/spam/auto_whitelist +auto_whitelist_file_mode 0666 + +# LANG TESTS +Mail::SpamAssassin::Plugin::TextCat +ok_languages en fr es it +ok_locales en fr es it + +score BODY_8BITS 1.500 +score CHARSET_FARAWAY 3.200 +score CHARSET_FARAWAY_HEADER 3.200 +score HTML_CHARSET_FARAWAY 0.500 +score MIME_CHARSET_FARAWAY 2.450 +score UNWANTED_LANGUAGE_BODY 2.800 + +# DCC +# use_dcc 1 => un plugin maintenant... +score DCC_CHECK 2.9 + +# RAZOR : +use_razor2 1 +razor_timeout 10 +score RAZOR2_CHECK 2.9 +score RAZOR2_CF_RANGE_51_100 1.3 + +# pyzor : +use_pyzor 0 + +# RBL (Realtime Blackhole List) +skip_rbl_checks 0 +score RCVD_IN_BL_SPAMCOP_NET 3 + +# misc +score HELO_DYNAMIC_IPADDR 0.3 +score BIZ_TLD 0.1 +score PRIORITY_NO_NAME 0.2 + +# disable HTML tests + +score HTML_MESSAGE 0 +score HTML_00_10 0 +score HTML_10_20 0 +score HTML_20_30 0 +score HTML_30_40 0 +score HTML_40_50 0 +score HTML_50_60 0 +score HTML_60_70 0 +score HTML_70_80 0 +score HTML_80_90 0 +score HTML_90_100 0 +#score HTML_COMMENT_8BITS 0 +score UPPERCASE_25_50 0 +score UPPERCASE_50_75 0 +score UPPERCASE_75_100 0 +score MIME_HTML_ONLY 0.1 +# From +# Trop de faux negatifs avec BAYES_(0|1|2|3|4)* +score BAYES_00 0 0 -0.01 -0.01 +score BAYES_01 0 0 -0.01 -0.01 +score BAYES_10 0 0 -0.01 -0.01 +score BAYES_20 0 0 -0.01 -0.01 +score BAYES_30 0 0 -0.01 -0.01 +score BAYES_40 0 0 -0.01 -0.01 +score BAYES_44 0 0 -0.01 -0.01 +score BAYES_50 0 0 0.1 0.1 +score BAYES_56 0 0 0.5 0.5 +score BAYES_60 0 0 1.0 1.0 +score BAYES_70 0 0 2.5 2.5 +score BAYES_80 0 0 3.5 3.5 +score BAYES_90 0 0 4.5 4.5 +score BAYES_99 0 0 8.0 8.0 + +score RCVD_IN_SORBS_DUL 0.3 +score SUBJ_ILLEGAL_CHARS 0 +score RCVD_IN_NJABL_DUL 0.3 + +score ADDRESS_IN_SUBJECT 0.1 + +score HELO_LH_HOME 1.0 + +#internal_networks 192.168.XXX/24 +trusted_networks 31.170.8.33 31.170.8.15 62.212.111.216 88.179.18.233 85.118.59.50 +#score ALL_TRUSTED 0.3 +score HELO_DYNAMIC_IPADDR 0.3 + +score FORGED_MUA_OUTLOOK 0.5 + +# Eudora sucks +score EXTRA_MPART_TYPE 0.1 +score MIME_BOUND_EQ_REL 0.1 +score MIME_QP_LONG_LINE 0.1 + +# SMTP senders *have* dynamic IP addresses +# A.B.C.D.dnsbl.sorbs.net -> 127.0.0.10 +score RCVD_IN_DYNABLOCK 0 +score HELO_DYNAMIC_IPADDR 0.3 +score RCVD_IN_SORBS 0.1 +score RCVD_IN_PBL 0.1 +score RCVD_IN_SORBS_DUL 0 + +# old bug... +score FH_DATE_PAST_20XX 0.0 +~~~ + +### URIBL + + + +~~~ +header __RCVD_IN_HOSTKARMA eval:check_rbl('HOSTKARMA-lastexternal','hostkarma.junkemailfilter.com.') +describe __RCVD_IN_HOSTKARMA Sender listed in JunkEmailFilter +tflags __RCVD_IN_HOSTKARMA net + +header RCVD_IN_HOSTKARMA_W eval:check_rbl_sub('HOSTKARMA-lastexternal', '127.0.0.1') +describe RCVD_IN_HOSTKARMA_W Sender listed in HOSTKARMA-WHITE +tflags RCVD_IN_HOSTKARMA_W net nice +score RCVD_IN_HOSTKARMA_W -5 + +header RCVD_IN_HOSTKARMA_BL eval:check_rbl_sub('HOSTKARMA-lastexternal', '127.0.0.2') +describe RCVD_IN_HOSTKARMA_BL Sender listed in HOSTKARMA-BLACK +tflags RCVD_IN_HOSTKARMA_BL net +score RCVD_IN_HOSTKARMA_BL 3.0 + +header RCVD_IN_HOSTKARMA_BR eval:check_rbl_sub('HOSTKARMA-lastexternal', '127.0.0.4') +describe RCVD_IN_HOSTKARMA_BR Sender listed in HOSTKARMA-BROWN +tflags RCVD_IN_HOSTKARMA_BR net +score RCVD_IN_HOSTKARMA_BR 1.0 + +ifplugin Mail::SpamAssassin::Plugin::URIDNSBL +urirhssub URIBL_HOSTKARMA_BL hostkarma.junkemailfilter.com. A 127.0.0.2 +describe URIBL_HOSTKARMA_BL Contains an URL listed in the URIBL HOSTKARMA blacklist +body URIBL_HOSTKARMA_BL eval:check_uridnsbl('URIBL_HOSTKARMA_BL') +tflags URIBL_HOSTKARMA_BL net +score URIBL_HOSTKARMA_BL 3.0 + +urirhssub URIBL_HOSTKARMA_BR hostkarma.junkemailfilter.com. A 127.0.0.4 +describe URIBL_HOSTKARMA_BL Contains an URL listed in the URIBL HOSTKARMA brownlist +body URIBL_HOSTKARMA_BR eval:check_uridnsbl('URIBL_HOSTKARMA_BR') +tflags URIBL_HOSTKARMA_BR net +score URIBL_HOSTKARMA_BL 2.0 + +urirhssub URIBL_HOSTKARMA_FRESH_2D hostkarma.junkemailfilter.com. A 127.0.2.1 +describe URIBL_HOSTKARMA_BL Contains an URL listed in the URIBL HOSTKARMA very young list +body URIBL_HOSTKARMA_FRESH_2D eval:check_uridnsbl('URIBL_HOSTKARMA_FRESH_2D') +tflags URIBL_HOSTKARMA_FRESH_2D net +score URIBL_HOSTKARMA_FRESH_2D 2.0 + +urirhssub URIBL_HOSTKARMA_FRESH_10D hostkarma.junkemailfilter.com. A 127.0.2.2 +describe URIBL_HOSTKARMA_BL Contains an URL listed in the URIBL HOSTKARMA young list +body URIBL_HOSTKARMA_FRESH_10D eval:check_uridnsbl('URIBL_HOSTKARMA_FRESH_10D') +tflags URIBL_HOSTKARMA_FRESH_10D net +score URIBL_HOSTKARMA_FRESH_2D 1.0 +~~~ + +### Howto écrire ses règles SpamAssassin + +TODO + + + +### Whitelister/Blacklister un email ou un nom de domaine + +Par utilisateur (~/.spamassassin/user_prefs) ou global (/etc/spamassassin/local_evolix.cf) : + + +~~~ +whitelist_from foo@bar.com +whitelist_from *@evolix.fr +blacklist_from pouet@camembert.com +~~~ + + +### AWL : AutoWhitelist + +SA a un puissant outil d'AWL si l'on définit bien une liste d'emails / expéditeurs +avant de l'initialiser. Néanmoins, il faut le maintenir : + +Pour lister sa whitelist (couple email / 2 1er octets de l'IP) + +~~~ +# sa-awl /var/spool/spam/auto_whitelist + + AVG (TOTSCORE/COUNT) -- EMAIL|ip=IPBASE + +AVG est le score moyen +TOTSCORE est le score total des mails +COUNT est le nombre de mails +~~~ + + +Pour supprimer les entrées "vues" moins de 2 fois : + +~~~ +# sa-awl --clean --min 2 /var/spool/spam/auto_whitelist +~~~ + +Pour supprimer des entrées particulières : + +~~~ +# spamassassin --remove-addr-from-whitelist=foo@bar +SpamAssassin auto-whitelist: removing address: foo@bar +~~~ + + + +## ClamAV + + + + + + + +### Constituer sa propre DB + +Le but est de créer une base de données contenant des signatures personnelles qui ne sont pas (encore) disponibles dans celles fournis par ClamAV. +On va montrer un exemple pour identifier un virus en PJ de type facture.doc, qui contient une macro Word pour infecter des postes Windows. + +La pièce-jointe est identifiable sur VirusTotal : [[BR]] + +Elle n'est repéré que par 6 AV. Il est reconnu en tant que W97M/Downloader.akh. On va utiliser ce nom (+evolix) pour le mettre dans notre base de données. +L'idée est d'identifier un endroit précis du fichier en utilisant par exemple hexdump : + +~~~ +61 69 6e 2e 00 53 6f 63 6b 65 74 2e 43 10 6c 6f |ain..Socket.C.lo| +~~~ + +Et d'ajouter ces 16 octets en guise signature. + +~~~ +# echo "W97M/Downloader.akh+evolix:0:*:61696e2e00536f636b65742e43106c6f" >> /var/lib/clamav/evolix.ndb +# chown clamav:clamav /var/lib/clamav/evolix.ndb +~~~ + +Dans le cas où il n'est pas évident de repérer une chaine précise on « fabriquera » une signature avec l'outil de ClamAV : sigtool. + +~~~ +# sig=$(cat facture.doc | sigtool --hex-dump | head -c 2048) +# echo "NomDuVirus+evolix:0:*:$sig" >> /var/lib/clamav/evolix.ndb +~~~ + +On peut aussi tout simplement utiliser le checksum du virus (un sha256 par exemple). + +~~~ +# sigtool --sha256 facture.doc >> /var/lib/clamav/evolix.hsb +~~~ + +Dans certains cas, comme un fichier HTML « forgé bizarrement », ClamAV va d'abord décomposer le fichier HTML. Il faudra générer la signature à partir de l'extraction. + +~~~ +# clamscan --debug --leave-temp facture.doc +> LibClamAV debug: cli_scanhtml: using tempdir /tmp/clamav-606ba4ba8c8504465cba15fc13c93942.tmp +# cd /tmp/clamav-606ba4ba8c8504465cba15fc13c93942.tmp +# sig=$(cat notags.html | sigtool --hex-dump | head -c 2048) +# echo "NomDuVirus+evolix:0:*:$sig" >> /var/lib/clamav/evolix.ndb +~~~ + +Evolix tient une base de signatures pour ClamAV + +### Bases officieuses + +#### Sanesecurity + +Sanesecurity contient de nombreuses bases de signatures de plus ou moins bonnes qualité : + + + +~~~ +$ rsync -avn rsync://rsync.sanesecurity.net/sanesecurity /tmp/sanesecurity/ +~~~ + +Un blog liste quelques signatures 0-day : + +#### Malwarepatrol + + + +~~~ +$ wget +~~~ + +Code XXXX à obtenir via inscription : (il existe aussi une version payante) + +#### SecuriteInfo + + + +inscription : (il existe aussi une version payante) + + +#### Linux Malware Detect + + + +~~~ +$ wget +~~~ + +#### Yara Rules + +Nécessite ClamAV 0.99 (bêta) qui pourra utiliser le moteur Yara : + + diff --git a/HowtoMail/DKIM.md b/HowtoMail/DKIM.md new file mode 100644 index 00000000..86f8a97a --- /dev/null +++ b/HowtoMail/DKIM.md @@ -0,0 +1,214 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto DKIM + +DKIM (DomainKeys Identified Mail) est une norme visant à signer les entêtes d'un email envoyé, et à vérifier cette signature +grâce à une clé publique publiée via un enregistrement DNS associé au nom de domaine expéditeur. + +Il existe en fait 2 normes : DomainKey (utilisé à l'origine par Yahoo) et DKIM (successeur de DomainKey plus "standardisé"). +Les 2 normes étant encore utilisées, le mieux est de les utiliser toutes les deux ! + +## Installation + +Exemple sous Debian 6 : + +~~~ +# aptitude install opendkim dk-filter opendkim-tools +# adduser opendkim ssl-cert +# adduser dk-filter ssl-cert +~~~ + +### Configuration de opendkim + +_opendkim_ est un démon avec lequel on peut communiquer soit via un socket unix, soit via un socket réseau. +Dans notre cas, on le fait écouter sur le réseau sur le port 8888. + +Dans le fichier _/etc/default/opendkim_ : + +~~~ +SOCKET="inet:8888@localhost" +~~~ + +Pour la suite, on suppose que le _selector_ DKIM vaut _default_. + +La configuration se fait dans le fichier _/etc/opendkim.conf_, dans lequel on précise quelques paramètres indispensables : + +~~~ +Domain example.com +Mode s +KeyFile /etc/ssl/private/default.private +Selector default + +InternalHosts /etc/dkim.peers +~~~ + +Puis on génère la clé DKIM de cette façon : + +~~~ +# opendkim-genkey -D /etc/ssl/private/ -d example.com -s default +# chgrp ssl-cert /etc/ssl/private/default.private +# chmod 640 /etc/ssl/private/default.private +~~~ + +On autorise les machines à utiliser à DKIM : + +~~~ +# echo "127.0.0.1" >> /etc/dkim.peers +# chmod 644 /etc/dkim.peers +~~~ + +À ce stade, on peut lancer opendkim : + +~~~ +# /etc/init.d/opendkim start +# ps auwx | grep dkim +opendkim 26947 0.0 0.0 171904 2488 ? Ssl 19:40 0:00 /usr/sbin/opendkim -x /etc/opendkim.conf -u opendkim -P /var/run/opendkim/opendkim.pid -p inet:8888@localhost +~~~ + +### Configuration de dk-filter + +_dk-filter_ (pour DomainKey) est très similaire à _opendkim_, il utilisera les mêmes fichiers +cryptographiques. Il se configure juste un peu différemment. + +Dans le fichier _/etc/default/dk-filter_ : + +~~~ +DAEMON_OPTS="-l -i /etc/dkim.peers" +DAEMON_OPTS="$DAEMON_OPTS -d example.com \ + -s /etc/ssl/private/default.private \ + -S default" +SOCKET="inet:8889@localhost" +~~~ + +Attention, dk-filter vérifie les droits bizarrement, on doit faire des modifications un peu "limite" : + +~~~ +# chown dk-filter /etc/ssl/private /etc/ssl/private/default.private +# chmod 110 /etc/ssl/private +~~~ + +On peut enfin (re)démarrer dk-filter : + +~~~ +# /etc/init.d/dk-filter restart +Restarting DomainKeys Filter: dk-filter. +# ps auwx | grep dk- +116 3852 0.0 0.0 64172 1340 ? Ssl 19:57 0:00 /usr/bin/dk-filter -u dk-filter -P /var/run/dk-filter/dk-filter.pid -p inet:8889@localhost -l -i /etc/dkim.peers -d example.com -s /etc/ssl/private/default.private -S default +~~~ + +## Configuration de Postfix + +Afin que postfix utilise nos démons opendkim et dk-filter, on ajoute simplement les instructions suivantes +dans le fichier main.cf : + +~~~ +non_smtpd_milters = inet:8888 inet:localhost:8889 +smtpd_milters = inet:8888 inet:localhost:8889 +~~~ + +On redémarre Postfix, et on peut ainsi tester via un envoi en local que tout fonctionne bien : + +~~~ +$ telnet 127.0.0.1 25 +HELO example.com +MAIL FROM: +RCPT TO: +DATA +From: +To: Foo +Subject: test DKIM + +Ceci est un test +. +~~~ + +On devrait ainsi recevoir un email avec les entêtes _DomainKey-Signature_ et _DKIM-Signature_. + +Si le mail n'est pas signé, il peut être intéressant d'ajouter l'option suivante dans la configuration de _opendkim_ pour savoir pourquoi : + +~~~ +LogWhy yes +~~~ + +## Modification de la zone DNS + +Il reste ensuite rajouter à la zone DNS du domaine en question l'enregistrement _default._domainkey_ qui contiendra, entre autre, la clé publique. +Pour cela, il suffit de copier le contenu du fichier _/etc/ssl/private/default.txt dans le fichier de zone_ : + +~~~ +default._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNg79uRMmFo0kvi061njNyhjVW8F4u0WxPfSWXEgi65QvUWEntYNuQ9RFN4em4cI7xLQ6zTOPTPjWYHiy0OYfWZbeBnuV97/a86IN4MAlP3G2bnoH9WTQiDjfDSHoixATaXg7ff66nyTOKxBK9n6yO8d3bfBZPpmhvrL8YofRdSQIDAQAB" ; ----- DKIM default for example.com +~~~ + +Si l'on est sûr que tous les mails émis avec le nom de domaine utilisé sont bien signés avec DKIM, on peut l'indiquer via +un 2ème enregistrement DNS __adsp._domainkey_ : + +~~~ +_adsp._domainkey IN TXT "dkim=all" +~~~ + +Attention, les mails émis sans signature DKIM seront alors pénalisés par les serveurs mail vérifiant les signatures DKIM. + + +## Vérifications + +On peut vérifier que tout est OK comme suit (si la commande ne renvoie rien, c'est que c'est OK) : + +~~~ +# opendkim-testkey -d example.com -s default -k /etc/ssl/private/default.private +~~~ + +On peut accessoirement vérifier que l'enregistrement ADSP est bien pris en compte : + +~~~ +# opendkim-testadsp example.com +~~~ + +## Mode multi-domaines + +*Brouillon à finaliser.* + +La configuration est légèrement différente. + +Exemple de configuration : + +/etc/opendkim.conf +~~~ +Canonicalization relaxed/relaxed +ExternalIgnoreList refile:/etc/opendkim/TrustedHosts +InternalHosts refile:/etc/opendkim/TrustedHosts +KeyTable refile:/etc/opendkim/KeyTable +LogWhy Yes +Mode sv +SigningTable refile:/etc/opendkim/SigningTable +Syslog Yes +SyslogSuccess Yes +TemporaryDirectory /var/tmp +UMask 002 +~~~ + +/etc/opendkim/TrustedHosts +~~~ +127.0.0.1 +~~~ + +/etc/opendkim/KeyTable +~~~ +default._domainkey.domaine1.com domaine1.com:default:/etc/opendkim/keys/domaine1.com/default.private +default._domainkey.domeina2.com domaine2.com:default:/etc/opendkim/keys/domaine2.com/default.private +~~~ + +/etc/opendkim/SigningTable +~~~ +*@domaine1.com default._domainkey.domaine1.com +*@domaine2.com default._domainkey.domaine2.com +~~~ + +## FAQ + +Question : j'obtiens ce message en démarrant : `Starting OpenDKIM Milter: opendkim: smfi_opensocket() failed` + +Réponse : la socket réseau est déjà occupée ! + +Question : j'obtiens ce message en démarrant : `Starting DomainKeys Filter: dk-filter: /etc/ssl/private/default.private: open(): Permission denied` + +Réponse : il y a un problème de permission pour accéder à la clé privée, dk-filter a une gestion bizarre des droits (cf astuce donnée plus haut) diff --git a/HowtoMail/Horde.md b/HowtoMail/Horde.md new file mode 100644 index 00000000..91c6b369 --- /dev/null +++ b/HowtoMail/Horde.md @@ -0,0 +1,59 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Horde + +## Installation Horde / IMP / modules + +Suivre la documentation "officielle" sur + +## FAQ + +Q : `HORDE [error] [imp] Failed to open sendmail [/usr/lib/sendmail] for execution. [pid 1415 on line 720 of "/usr/share/horde3/imp/lib/Compose.php"]` + +R : S'assurer que la fonction popen() de PHP est autorisée + +Q : Page blanche et aucune erreur dans les logs PHP/Apache + +R : s'assurer que la fonction `putenv()` est autorisée dans la conf PHP/Suhosin (l'appel à cette fonction se fait dans _/usr/share/horde3/lib/Horde/NLS.php:611_, méthode `NLS::setLang()`. + +Q : `This request cannot be completed because the link you followed or the form you submitted was only valid for 0 seconds.` + +R : Tenter de regénérer la configuration de IMP via l'interface d'administration +Ou d'ajouter `$conf['urls']['token_lifetime'] = 1800;` dans /etc/horde/horde3/conf.php + +Q : Avec IMP, utilisation de la boîte _Envoyé_ / _Envoy??_... non utilisable en IMAP + +R : + +~~~ +$ apt-get source imp4 +$ export LANG=fr_FR && export LC_ALL=fr_FR && export LC_TYPE=fr_FR && export XTERM_LOCALE=fr_FR && xterm +$ sed -i s/"Envoyé"/"Sent"/ imp4-4*/po/fr_FR.po +$ msgfmt imp4-4*/po/fr_FR.po +$ scp messages.mo SERVEUR: +$ ssh SERVEUR sudo mv messages.mo /usr/share/horde3/imp/locale/fr_FR/LC_MESSAGES/imp.mo +$ ssh SERVEUR sudo /etc/init.d/apache2 restart +~~~ + +Q : J'obtiens plein d'erreurs Javascript depuis une mise-à-jour de Horde ou IMP du type : `$H is not defined`, etc. + +R : Les dernières versions de Horde/IMP utilisent des liens symboliques pour le Javascript, il faut donc bien s'assurer d'avoir `Options Indexes MultiViews FollowSymlinks` dans Apache + +Q : Avec Turba, j'obtiens l'erreur `Le contact demandé n'existe pas.` en éditant un contact + +R : il vous manque le paquet Debian php-mdb2-driver-mysql + +Q : Lors de la rédaction d'un message, le domaine n'est pas définit dans le champ From (adresse affichée de la forme : _jdoe@_) et l'envoi de mail n'est donc pas possible. + +R : il faut définir le domaine mail du serveur dans la config de imp dans le fichier _/etc/horde/imp4/prefs.php_ dans cette section : +~~~ +[...] +// default outgoing mail domain and address completion +$_prefs['mail_domain'] = array( + 'value' => 'example.com', + 'locked' => false, + 'shared' => false, + 'type' => 'text', + 'desc' => _("When sending mail or expanding addresses, what domain should we append to unqualified addresses (email addresses without \"@\")?")); +[...] +~~~ \ No newline at end of file diff --git a/HowtoMail/Introduction.md b/HowtoMail/Introduction.md new file mode 100644 index 00000000..2ab140a8 --- /dev/null +++ b/HowtoMail/Introduction.md @@ -0,0 +1,149 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Howto mail : introduction + +Les courriers électroniques sont l'un des services les plus utilisés sur les réseaux informatiques. De nombreuses structures sont fortement dépendantes de ce service. +C'est la raison pour laquelle il est important de pouvoir le comprendre et le maîtriser. + +Avant toute chose, il est recommandé de lire attentivement la [RFC 2821: Simple Mail Transfer Protocol](http://www.rfc-editor.org/in-notes/rfc2821.txt). Des règles d'usage ont également été établies, et toute personne utilisant les courriers électroniques devrait avoir lu la [1855 : Netiquette Guidelines](http://www.rfc-editor.org/in-notes/rfc1855.txtRFC). À défaut, il semble important de diffuser un résumé des principales consignes auprès des utilisateurs d'une structure. + +En guise d'introduction, il semble important de rappeler le principe d'une conversation SMTP entre un client et un serveur : + +~~~ +$ telnet smtp.wanadoo.fr 25 + +220 [identification of their software and version information] +HELO [hostname] +250-[hostname] +MAIL From: +250 Ok +RCPT To: Plouf Plouf +250 Ok +DATA +354 Enter mail, end with "." on a line by itself +From: John Doe +To: Thomas Oto +Subject: Hello World + +J'utilise un super client mail ;-) +. +250 Ok: queued as [queue_id] +QUIT +221 Bye +~~~ + +Pour une récupération via le protocole POP : + +~~~ +$ telnet pop.example.com 110 ++OK Hello there. + +user nom_utilisateur ++OK Password required. + +pass mot_de_passe ++OK logged in. + +stat ++OK 979 5583265 + +list ++OK POP3 clients that break here, they violate STD53. +1 18759 +2 31764 +3 2836 +4 2837 +[...] + +uidl ++OK +1 1336738341.6934.foobar.example.com,S=12655 +2 1336738356.6953.foobar.example.com,S=12656 +3 1336738369.6978.foobar.example.com,S=12659 +[...] + +retr 42 ++OK 2836 octets follow. +Return-Path: +[...] + +top 42 3 ++OK headers follow. + +dele 42 ++OK Deleted. + +noop ++OK Yup. + +quit ++OK Bye-bye. +~~~ + +Pour une récupération via le protocole IMAP : + +~~~ +$ telnet imap.example.com 143 + +* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION STARTTLS] +Courier-IMAP ready. Copyright 1998-2008 Double Precision, Inc. See COPYING for distribution information. + +. capability + +* CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION STARTTLS +. OK CAPABILITY completed + +. login nom_utilisateur mot_de_passe +. OK LOGIN Ok. + +. LIST "" * + +* LIST (\HasNoChildren) "." "INBOX.Corbeille" +* LIST (\HasNoChildren) "." "INBOX.Deleted Messages" +[...] + +* LIST (\Marked \HasChildren) "." "INBOX" +. OK LIST completed + +. select INBOX + +* FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent) +* OK [PERMANENTFLAGS (\* \Draft \Answered \Flagged \Deleted \Seen)] Limited +* 978 EXISTS +* 116 RECENT +* OK [UIDVALIDITY 1235180478] Ok +* OK [MYRIGHTS "acdilrsw"] ACL +. OK [READ-WRITE] Ok + +. UID FETCH 1:* RFC822.SIZE + +* 1 FETCH (UID 330392 RFC822.SIZE 18759) +[...] + +* 978 FETCH (UID 331370 RFC822.SIZE 2837) +. OK FETCH completed. + +. UID FETCH 331363 BODY[HEADER] + +* 42 FETCH (UID 331363 BODY[HEADER] {3937} +Return-Path: +[...] + +* 971 FETCH (FLAGS (\Seen)) +. OK FETCH completed. + +. UID FETCH 331363 BODY[] + +* 971 FETCH (UID 331363 BODY[] {20742} +Return-Path: +[...] +. OK FETCH completed. + +. NOOP +. OK NOOP completed + +. LOGOUT + +* BYE Courier-IMAP server shutting down +. OK LOGOUT completed +~~~ \ No newline at end of file diff --git a/HowtoMail/Mailgraph.md b/HowtoMail/Mailgraph.md new file mode 100644 index 00000000..2b34f4a1 --- /dev/null +++ b/HowtoMail/Mailgraph.md @@ -0,0 +1,55 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowtoMail/Mailgraph + +## Comment lire les graphiques de Mailgraph ? + +Mailgraph produit deux catégories de graphiques par jour, semaine, mois et année : + + 1. Le graphique qui affiche les mails reçus ; +[[Image(1.png)]][[BR]] + +* En bleu est affiché le nombre de messages envoyés à la minute ; +* En vert est affiché le nombre de messages reçus à la minute. + + 2. Le graphique qui affiche les types de mails reçus (Bounce, virus, spam, rejected). +[[Image(2.png)]] + +* En noir est affiché le nombre de « bounce » envoyés à la minute ; +* En jaune est affiché le nombre de virus reçus à la minute ; +* En gris est affiché le nombre de spams à la minute ; +* Et enfin en rouge est affiché le nombre de « rejected » à la minute. + +### Quelques définitions + +#### Bounced mail + +Il s'agit d'un mail que le serveur renvoi à l'expéditeur (en interne) lorsque que l'adresse mail dessinatrice est incorrecte (n'existe pas, inbox pleine, ...). +Par exemple un mail envoyé à jacques.dupond@gmail*l*.com renverra sûrement une erreur car cette adresse mail n'existe sûrement pas. + +#### Rejected mail + +Il s'agit des mails rejetés par le serveur pour plusieurs raisons, par exemple un domaine ou une adresse IP blacklisté, ou bien après analyse du message par un antispam. + +## Installation sans CGI + +Il est possible de lancer un script en Cron pour générer des graphiques statiques : + +~~~ +#!/bin/sh +MAILGRAPH_PATH=/usr/lib/cgi-bin/mailgraph.cgi # Debian +#MAILGRAPH_PATH=/usr/local/www/cgi-bin/mailgraph.cgi # FreeBSD +#MAILGRAPH_PATH=/usr/local/lib/mailgraph/mailgraph.cgi # OpenBSD + +MAILGRAPH_DIR=/var/www/mailgraph + +umask 022 + +mkdir -p $MAILGRAPH_DIR + +$MAILGRAPH_PATH | sed '1,2d ; s/mailgraph.cgi?// ; s/src="?/src="/' > $MAILGRAPH_DIR/index.html + +for i in 0-n 0-e 0-g 1-n 1-e 1-g 2-n 2-e 2-g 3-n 3-e 3-g; do + QUERY_STRING=$i $MAILGRAPH_PATH | sed '1,3d' > $MAILGRAPH_DIR/$i +done +~~~ \ No newline at end of file diff --git a/HowtoMail/Postfix.md b/HowtoMail/Postfix.md new file mode 100644 index 00000000..e856e147 --- /dev/null +++ b/HowtoMail/Postfix.md @@ -0,0 +1,942 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Postfix + +Le MTA (Mail Transport Agent) est l'élément principal d'un serveur de courriers électroniques. Tout courrier électronique transite forcément par un MTA. Il existe de nombreux MTA, appelés plus communément "serveurs mail". L'une des implémentations la plus connue est sendmail, qui est Open Source (écrit sous Sendmail license). Les alternatives sont les logiciels Postfix (écrit sous IBM PUBLIC LICENSE Version 1.0), Exim (écrit sous GNU General Public License), Qmail (distribué avec des restrictions), Courier (écrit sous GNU General Public License) ainsi que des logiciels propriétaires tels que Microsoft Exchange, Sun Java System Messaging Server, IBM Lotus Domino, etc. + +Postfix est un logiciel écrit par Wietse Venema, un chercheur d'IBM, en alternative au fameux sendmail. Placé sous IBM PUBLIC LICENSE Version 1.0, sa première version date de 1998. Il a été conçu pour être sûr, rapide et facile à administrer. À l'heure où ces lignes sont écrites, la version stable est la version 2.7. + +## Sommaire + +* Installation +* Configuration de base +* Restrictions +* Authentification SMTP +* Support SSL/TLS +* Fichier main.cf détaillé +* Maintenance +* Utilisation avec un annuaire LDAP +* Postfix dans un chroot + +## Installation + +Postfix s'installe sur de nombreux systèmes (de nombreux UNIX, Linux, etc.) à partir des sources. Il existe un bon nombre d'extensions disponibles (Berkeley DB, LDAP, MySQL, PCRE, PostgreSQL, SASL, TLS, IPv6). Des paquets existent pour de nombreux systèmes (distributions Linux, *BSD, Mac OS X, Solaris, HP-UX, etc.). + +Sous Debian, on fera : +~~~ +# aptitude install postfix +~~~ + +## Configuration minimale + +Il faut avoir à l'esprit que Postfix, au contraire de Sendmail, n'a pas une architecture monolithique. En effet, par défaut, seul le processus master tourne en permanence et gère le démarrage d'autres processus qui ont des tâches dédiées (cleanup, smtpd, pickup, etc.) notamment la transition entre les différentes files d'attente de Postfix (incoming, active, deferred, corrupt, hold). La configuration de ces processus se trouve dans le fichier _master.cf_. Pour une configuration de base, il n'est pas utile d'éditer ce fichier. + +La configuration générale de Postfix se trouve dans le fichier _main.cf_ dont voici un exemple (très) minimal : +~~~ +command_directory = /usr/sbin +daemon_directory = /usr/lib/postfix +myhostname = [FQDN] +alias_maps = hash:/etc/aliases +~~~ + +[FQDN] correspond au nom de la machine complété du domaine auquel elle appartient. Par exemple hote.example.com est un nom d'hôte pleinement qualifié. Il faut absolument préciser un nom d'hôte pleinement qualifié (FQDN) à la variable myhostname si la commande hostname renvoie le nom d'hôte de la machine sans le domaine. + +Il faut s'assurer que la base de données d'aliases existe, c'est-à-dire que le fichier _/etc/aliases_ existe (même vide, mais il est conseillé au minimum de l'utiliser pour les comptes système). Voici un exemple : +~~~ +root: jdoe +abuse: root +noc: root +security: root + +postmaster: msmith +MAILER-DAEMON: postmaster + +daemon: /dev/null +bin: /dev/null +sys: /dev/null +~~~ + +Ensuite, il faut générer la base de données _aliases_ à l'aide de la commande _newaliases_. Le paramètre _alias_maps_ contient normalement par défaut _nis:mail.aliases_. Il faut donc préciser ce paramètre dans le fichier (très) minimal si l'on n'utilise pas NIS, sous peine d'obtenir des messages suivants : _warning: dict_nis_init: NIS domain name not set - NIS lookups disabled_ + +Avec cette configuration minimale, Postfix fonctionne. Pour une utilisation un peu plus aisée, vous pouvez préciser quelques paramètres supplémentaires : +~~~ +mydestination = $myhostname solaris localhost +localhost.[domain.tld] 127.0.0.1 [adresses IP] +~~~ + +[domain.tld] correspond au domaine auquel la machine appartient et [adresses IP] est la liste des adresses IPv4 attachées aux interfaces de la machine sur lesquelles le serveur mail écoute. La paramètre mydestination permet de spécifier à Postfix la liste des noms et des adresses IP qu'il devra considérée comme locale. Ainsi, si vous envoyez un message avec une adresse non présente dans cette liste (mais pointant pourtant vers la machine), vous obtiendrez l'erreur suivante : mail for [adresse_non_listee] loops back to myself et le message ne sera pas délivré. +Restrictions + +Pour de multiples raisons, il n'est pas question d'autoriser n'importe qui à envoyer un courrier électronique n'importe où. Il faut restreindre les courriers entrants à cause des courriers électroniques non sollicités, ainsi que les courriels sortants pour éviter que le service soit utilisé par des personnes non-dignes de confiance. + +On peut avoir des restrictions à différents niveaux : + +~~~ +smtpd_client_restrictions Rejete toutes les commandes du client +smtpd_helo_restrictions Rejete les informations HELO/EHLO +smtpd_sender_restrictions Rejete l'information MAIL FROM +smtpd_recipient_restrictions Rejete l'information RCPT TO +smtpd_data_restrictions Rejete la commande DATA +smtpd_etrn_restrictions Rejete la commande ETRN +~~~ + +Les restrictions que l'on pourra imposer le seront par des tables d'accès, contrôle de la syntaxe utilisée, élements de la transaction, vérification DNS, RDNSBL, etc. Elles permettront d'exclure certains clients non désirables (non respect des normes de l'échange avec le serveur, adresses IP non résolues, etc.) et de permettre à d'autres d'envoyer des courriers à n'importe qui (authentification par adresses IP). Voici quelques arguments : + +* check_X_access type:table où X = client, helo, recipient ou sender +* permit_X où X = auth_destination, mynetworks, mx_backup +* reject_X où X = unauth_destination, invalid_hostname, non_fqdn_hostname, non_fqdn_recipient, non_fqdn_sender, unauth_pipeling, unknown_client, unknown_hostname, unknown_recipient_domain, unknown_sender_domain + +Ainsi, chaque serveur impose ses restrictions selon les contraintes imposées. Des restrictions raisonnables peuvent être : + +~~~ +mynetworks = 127.0.0.0/8,[::1]/128 +smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, + reject_unauth_destination, check_client_access hash:/etc/postfix/acces_client +smtpd_helo_restrictions = reject_invalid_hostname +smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/acces_expediteur +smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination +~~~ + + +## Fichier _main.cf_ détaillé + +On rappelle que la configuration principale de Postfix se trouve dans le fichier _main.cf_ + +Nous allons découper ce fichier en plusieurs sections afin d'en détailler les options. + +### Section : Emplacements + +~~~ +## fichier principal de configuration de Postfix +## commentaires de Gregory Colpart reg AT evolix DOT fr +## version 1.0 : 1ere version publique (05.04.2010) + +######################## +# Section : Emplacements +######################## + +# Repertoire ou se trouvent les commandes de postfix [OBLIGATOIRE] +#par defaut, = $program_directory +command_directory = /usr/sbin + +# Repertoire ou se trouvent les demons de postfix [OBLIGATOIRE] +#par defaut, = $program_directory +daemon_directory = /usr/lib/postfix + +# Variable pour indiquer les emplacements des commandes et demons de postfix +#program_directory = /usr/lib/postfix + +# Repertoire contenant les fichiers de boites aux lettres +#par defaut, = /var/mail +#mail_spool_directory = + +# Repertoire de la file d'attente de postfix +#par defaut, = /var/spool/postfix +#queue_directory = + +# Boites aux lettres +#par defaut, = +home_mailbox = Maildir/ + +# Transmettre les mails a un MDA +#par defaut, = +#mailbox_command = /usr/bin/procmail + +# Separateur entre noms d'utilisateur et extensions d'adresse +# mettre + pour intégration avec amavis +#par defaut, = +recipient_delimiter = + + +# Controle si le repertoire existe (souvent pour les systemes de fichiers montes) +#par defaut, = no +#require_home_directory = + +# Commande pour transmettre le courrier a un MDA +#par defaut, = +#mailbox_command = /usr/bin/procmail + +# Banniere SMTP affichee +#par default, = $myhostname ESMTP $mail_name +smtpd_banner = $myhostname ESMTP mail server + +# Groupe des commandes set-gid ayant des acces en ecriture +#par defaut, = postdrop +# setgid_group = postdrop + +# Produire des "biff notifications" aux utilisateurs pour +# prevenir de l'arrivee de nouveaux mails +# par default, = yes +#biff = no +~~~ + +### Section : domaines + +~~~ +#################### +# Section : domaines +#################### + +# Indique le nom d'hote pleinement qualifie ou se trouve postfix [OBLIGATOIRE] +#par defaut, = [retour de la commande Unix hostname] +myhostname = computer.example.com + +# Variable indiquant le domaine dans lequel se trouve la machine +#par defaut, = [partie domain de la variable $myhostname] +#mydomain = + +# Liste des noms de domaine (ou IP) consideres comme local +#par defaut, = $myhostname, localhost.$mydomain, localhost +mydestination = $myhostname + +# Indique le domaine apparaissant dans le courrier envoye +#par defaut, = $myhostname +myorigin = example.com + +# Liste de domaine fonctionnant UNIQUEMENT avec des alias virtuels +#par defaut, = $virtual_alias_maps +virtual_alias_domains = [ domaines avec alias virtuels ] + +# Liste de domaine fonctionnant avec des comptes virtuels +#par defaut, = $virtual_mailbox_maps +virtual_mailbox_domains = [ domaines avec comptes virtuels ] + +# Repertoire de base de l'espace de stockage +#par defaut, = +virtual_mailbox_base = / + +# Ajoute $mydomain aux adresse ne compoirtant que la partie hote sans le domaine +#par defaut, = yes +#append_dot_mydomain = no + +# Ajoute $myorigin aux adresses ne comportant pas de composante de domaine +#par defaut, = yes +#append_at_myorigin = no + +# Liste de domaines cachant des sous-domaines internes +#par defaut, = +#masquerade_domains = + +# A l'exception de certains comptes : +#par defaut, = +#masquerade_exceptions = root, admin + +# Champs d'application de la reecriture des sous-domaines caches +#par defaut, = envelope_sender, header_sender, header_recipient +#masquerade_classes = + +# Sites eligibles pour un vidage rapide (postqueue -s [domain.tld]) +#par defaut, = $relay_domains +#fast_flush_domains = + +# Interfaces sur lesquelles ecoutent postfix +#par defaut, = all +#inet_interfaces = all + +# Envoyer les mails avec une IP spécifique +smtp_bind_address = 192.168.1.1 + +# Adresse IP externe du firewall/proxy si derriere NAT ou proxy +# evite principalement les boucles si MX secondaire et MX primaire indisponible +#par defaut, = +#proxy_interfaces = [adresse IP] + +# Domaines acceptes pour faire relai (MX 2aire) +#relay_domains = [domaine a relayer] +~~~ + +### Section : base de donnees + +~~~ +########################### +# Section : base de donnees +########################### + +# Liste des bases de donnees utilisees par l'agent de distribution locale +# Pour regenerer une base de donnees : postalias /etc/aliases (par ex) +#par defaut, = hash:/etc/aliases, nis:mail.aliases +alias_maps = hash:/etc/aliases hash:/etc/postfix/liste_diff ldap:ldapaliases + +# Liste des bases de donnees locales +# Pour regenerer avec newaliases +#par defaut, = hash:/etc/aliases +alias_database = hash:/etc/aliases hash:/etc/postfix/liste_diff + +# Chemin vers la commande newaliases +#par defaut, = /usr/bin/newaliases +#newaliases_path = + +# Base de donnes d'alias virtuels +# ne pas oublier : postmap /etc/postfix/virtual +#par defaut, = $virtual_maps +virtual_alias_maps = hash:/etc/postfix/virtual + +# Base de donners des boites virtuelles +# ne pas oublier : postmap /etc/postfix/vmailbox +#par defaut, = +virtual_mailbox_maps = hash:/etc/postfix/vmailbox + +# Reecriture des adresses +#par defaut, = +#canonical_maps = hash:/etc/postfix/canonical + +# Reecriture des adresses a l'arrivee (ecrase $canonical_maps) +#par defaut, = +#recipient_canonical_maps = hash:/etc/postfix/canonical + +# Reecriture des adresses au depart +#par defaut, = +#sender_canonical_maps = hash:/etc/postfix/canonical + +# Adresses changees +#relocated_maps = hash:/etc/postfix/relocated + +# Boite pour receptionner tous les utilisateurs inconnus +#luser_relay = spam + +# Liste de base de donnees contenant les adresses locales permettant de rejeter les messages aux utilisateurs inconnus +# (sera nulle pour recuperer les courriels vers les utilisateurs inconnus) +#par defaut, = proxy:unix:passwd.byname $alias_maps +#local_recipient_maps = + +# MAILING-LIST nommee xx +# dans le fichier /etc/aliases : +# xx: user1@domain1 user2@domain2 etc. +# owner-xx: admin@domain +# Utiliser ou non l'alias xx-owner comme adresse d'enveloppe d'expedition +#par defaut, = yes +#owner_request_special = + +# Utiliser l'adresse relle de l'admin au lieu de xx-owner +#par defaut, = no +#expand_owner_alias = +~~~ + +### Section : paramètres de la file d'attente + +~~~ +########################################### +# Section : parametres de la file d'attente +########################################### + +# Lorsqu'un message n'a pas ete delivre, Postfix adjoint une marque indiquant le moment ou la prochaine tentaive pourra avoir lieu + +# Delai au-dela duquel les messages non delivres seront renvoyes a l'expediteur +#par defaut, = 5d +#maximal_queue_lifetime = + +# Intervalle de temps ou postfix examinera la file +# Il examine notamment la file deferred pour voir si de NOUVEAUX messages sont arrives +# Il faut aussi que la marque indique qu'ils soient prets +#par defaut, = 1000s +#queue_run_delay = + +# A chaque echec, le delai de la prochaine distribution double, avec les restrictions suivantes : +# Delai minimal +#par defaut, = 1000s +#minimal_backoff_time = +# Delai maximal +#par defaut, = 4000s +#maximal_backoff_time = + +# Si maxproc est vide (master.cf), nombre maximal est : +#par defaut, = 100 +#default_process_limit = + +# Nombre maximal de destinataires stockes en memoire par qmgr pour un transport particulier +#par defaut, = 10000 +#default_recipient_limit = + +# Nombre limitant de messages envoyes simultanement INITIALEMENT pour une destination particuliere +# (forcement majoree par maxproc du master.cf ou $default_process_limit) +#par defaut, = 5 +#initial_destination_concurrency = + +# Une fois ces messages distribues, si il reste des messages dans la file d'attente pour cette destination +# particuliere, postfix augmente le nombre de tentative tant qu'il ne detecte pas de probleme avec +# la destination, avec la limite suivante : +#par defaut, = 20 +#default_destination_concurrency_limit = + +# Cette limite peut etre differente selon le type de transport utilise : +#par defaut, = $default_destination_concurrency_limit +#lmtp_destination_concurrency_limit = +#par defaut, = 2 +#local_destination_concurrency_limit = +#par defaut, = $default_destination_concurrency_limit +#relay_destination_concurrency_limit = +#par defaut, = $default_destination_concurrency_limit +#smtp_destination_concurrency_limit = +#par defaut, = $default_destination_concurrency_limit +#virtual_destination_concurrency_limit = + +# On peut aussi limiter le nombre maximum de destinataire pour un meme message +# Si le nombre de destinataire depasse la limite, postfix divise en groupe d'adresses plus petites et envoie des copies distinctes du message +#par defaut, = 10000 +#default_destination_recipient_limit = +#par defaut, = $default_destination_recipient_limit +#lmtp_destination_recipient_limit = +#par defaut, = 1 +#local_destination_recipient_limit = +#par defaut, = 20000 +#qmgr_message_recipient_limit = +#par defaut, = $default_destination_recipient_limit +#relay_destination_recipient_limit = +#par defaut, = $default_destination_recipient_limit +#smtp_destination_recipient_limit = +#par defaut, = 1000 +#smtpd_recipient_limit = +#par defaut, = $default_destination_recipient_limit +#virtual_destination_recipient_limit = + +# Nombre maximum de destinataires pour un transport lorsque priorite superieure de transport +#par defaut, = 1000 +#default_extra_recipient_limit = + +# Types d'incidents a rapporter +# resource : message non delivre pour probleme de ressource +# software : message non delivre pour probleme de logiciels +# policy : envoie le transcription smtp d'un message rejete par restrictions +# protocol : envoie toute transcription smtp erronee +# delay : envoie les entetes de messages differes +# bounce : envoie les entetes de tous les message renvoyes +# 2bounce : envoie les entetes de tous les messages renvoyes non delivres +#par defaut, = resource, software +notify_classes = resource, software, bounce, 2bounce, delay, policy, protocol + +# A qui les reporter ? +#Pour delay +#par defaut, = postmaster +delay_notice_recipient = delay +#Pour policy, protocol, resource, software +#par defaut, = postmaster +error_notice_recipient = error +#Pour bounce +#par defaut, = postmaster +bounce_notice_recipient = bounce +#Pour 2bounce +#par defaut, = postmaster +2bounce_notice_recipient = bounce +~~~ + +### Section : restrictions + +~~~ +######################## +# Section : restrictions +######################## + +# Restrictions au depart de la conversation +#par defaut, = +smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_client_access hash:/etc/postfix/acces_client +# Restrictions au niveau de la commande HELO/EHLO +#par defaut, = +smtpd_helo_restrictions = reject_invalid_hostname +# Restrictions au niveau de la commande MAIL FROM +#par defaut, = +smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/acces_expediteur +# Restrictions au niveau de la commande MAIL FROM +#par defaut, = permit_mynetworks, reject_unauth_destination +smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination + +# Attendre la commande 'RCPT TO' avant d'evaluer les restrictions ? +# (peut poser pb avec certains clients et permet d'avoir renseignements suppl) +#par defaut, = yes +#smtpd_delay_reject = + +# Definition des plages IP appartenant a mynetworks +#par defaut, toutes les plages d'adresses IPv4 (et IPv6) des interfaces +mynetworks = 127.0.0.0/8,[::1]/128,10.0.0.0/16 + +# Exiger la commande HELO/EHLO +#par defaut, = no +smtpd_helo_required = yes + +# Exiger syntaxe conforme dans les commandes MAIL FROM ou RCPT TO +#par defaut, = no +#strict_rfc821_envelopes = + +# Rejeter le courrier provenant d'une adresse inexistante ? +#par defaut, = no +#smtpd_reject_unlisted_sender = + +# Rejeter le courrier a destination d'une adresse inexistante ? +#par defaut, = yes +#smtpd_reject_unlisted_recipient = +~~~ + +## Maintenance + +Postfix renvoie toutes ses actions à Syslog avec la facility LOG_MAIL. On retrouve donc les fichiers de journalisation définis dans le fichier _/etc/syslog.conf_ : +~~~ +mail.* -/var/log/mail.log +mail.info -/var/log/mail.info +mail.warn -/var/log/mail.warn +mail.err /var/log/mail.err +~~~ + +À noter que les renseignements dans les fichiers de journalisation, les adresses électroniques affichées sont celles d'enveloppe. + +Il faut également s'occuper des différentes files d'attente (ou queues) de Postfix. Les files d'attente principales sont incoming, active et deferred : +~~~ +incoming : première étape pour tous les nouveaux messages (après un passage par cleanup) +active : messages en cours de livraison (provenant principalement d'incoming ou deferred) +deferred : messages non délivrés lors du premier essai +~~~ + +Il existe aussi d'autres files d'attente, qui servent beaucoup moins fréquemment. +~~~ +corrupt : messages invalides +hold : messages mis de côté +~~~ + +Ces files d'attente sont des répertoires dans lesquels chaque message est stocké dans un fichier (sur une seule ligne), avec une arborescence de 16 répertoires (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F) pour optimiser lorsqu'un grand nombre de messages est dans une file d'attente. On peut ainsi accéder directement aux messages lorsqu'ils sont dans une file d'attente (lecture, modification, suppression) mais pour des actions, il est plutôt conseillé de passer par les commandes d'administration des files d'attentes. + +_sendmail -bp (ou mailq)_ liste toutes les files d'attente. Cela nous donne pour chaque message : + +* Queue ID +* Taille du message +* Date d'arrivée dans la file d'attente +* Expéditeur +* Éventuelle raison de non-livraison (entre parenthèses) +* Destinataires(s) + +Voici dans quel ordre sont listés les messages : + +* Messages de la queue active (une étoile figure à côté du Queue ID) +* Messages de la queue deferred +* Messages de la queue hold (un point d'exclamation figure à côté du queue ID) + +Exemples pratiques + +* _postcat -vq queue_id_ affiche le contenu d'un message +* _postcat -vq queue_id > themessage.txt_ copie le message dans un fichier +* _postsuper -d queue_id_ supprime le message correspondant au queue_id +* _postsuper -d ALL_ supprime tous les messages de la queue deferred +* _postsuper -d ALL deferred_ supprime tous les messages de la queue deferred +* _postsuper -h queue_id_ place "on hold" le message correspondant au queue_id. De la même façon, on a _postsuper -h ALL_ et _postsuper -h ALL deferred_ +* _postsuper -H queue_id_ libère un message placé "on hold". On peut aussi libérer tous les messages grâce à _postsuper -H ALL_ +* _postsuper -r queue_id_ refait passer le message correspondant au queue_id. Il est replacé dans la queue maildrop et repassera donc par les différents processus (pratique dans le cas où les alias virtuels ou les ré-écritures d'adresses ont changé) et se verra attribuer un nouveau queue_id. (attention, toutes ces étapes ne sont pas immédiates, il faut attendre que _sendmail -q (ou mailq -q)_ ré-active directement tous les messages des différentes queues (les messages deferred repassent directement dans la queue active, etc.). Cette commande est à utiliser avec modération, surtout sur les systèmes où les files d'attente sont chargées. + +À l'aide de petits scripts, on pourra utiliser ces commandes sur des ensembles de messages. Par exemple : + +~~~ +mailq | tail -n +2 | awk 'BEGIN { RS = "" } /user@example\.com$/ { print $1 }' | postsuper -h - +mailq | tail -n +2 | awk 'BEGIN { RS = "" } /example2\.com$/ { print $1 }' | tr -d '*!' | postsuper -d - +~~~ + +ou + +~~~ +# mailq > mailq.log +# for var in $(grep mailq.log | cut -b '1-12'); do postsuper -d $var; done +~~~ + +Note : le _BEGIN { RS = "" }_ est nécessaire car la sortie de mailq peut être sur plusieurs lignes, et le _tr -d '*!' _ permet de ne pas prendre les messages "on hold" + +* _postsuper -p_ purge des fichiers temporaires (en cas de crash par exemple) +* _postsuper -s_ réparation/vérification des arborescences de files d'attente + +À noter la commande _qshape_, permettant par exemple de lister les messages dans la file d'attente deffered : + +~~~ +# qshape deferred + T 5 10 20 40 80 160 320 640 1280 1280+ + TOTAL 78 0 0 0 0 1 0 0 0 0 77 + gmail.fr 11 0 0 0 0 0 0 0 0 0 11 + homail.fr 3 0 0 0 0 0 0 0 0 0 3 + yaoo.fr 2 0 0 0 0 0 0 0 0 0 2 + yahou.fr 2 0 0 0 0 0 0 0 0 0 2 + oange.fr 2 0 0 0 0 0 0 0 0 0 2 + hotmai.fr 2 0 0 0 0 0 0 0 0 0 2 + wanado.fr 2 0 0 0 0 0 0 0 0 0 2 + orangr.fr 1 0 0 0 0 0 0 0 0 0 1 + prange.fr 1 0 0 0 0 0 0 0 0 0 1 + ornage.fr 1 0 0 0 0 0 0 0 0 0 1 +~~~ + + +Le processus bounce gère les messages de non-livraison qui sont stockés dans les répertoires /var/spool/postfix/bounce/*, /var/spool/postfix/defer/* ou encore /var/spool/postfix/trace/* selon les types de message. + +La surveillance régulière des fichiers de journalisation ainsi que des files d'attente s'avère nécessaire, éventuellement à l'aide d'outils permettant de générer des statistiques, des courbes, etc. On peut ainsi citer l'outil mailgraph qui trace des courbes rrdtool à partir du fichier de journalisation, ou encore Munin qui trace des courbes selon l'état des files d'attente. L'utilisation de courbes personnalisées est fortement recommandée. + +En ce qui concerne les messages d'alerte, il faut gérer cela au niveau des alias. Par exemple, au niveau d'un serveur MX primaire : +~~~ +notify_classes = resource, software, bounce, 2bounce, delay +delay_notice_recipient = delay +error_notice_recipient = error +bounce_notice_recipient = bounce +2bounce_notice_recipient = 2bounce +~~~ + +Et ensuite, on ajoute les alias suivants : +~~~ +error: localadmin +mailer-daemon: postmaster +error: postmaster +bounce: postmaster +2bounce: postmaster +abuse: postmaster +postmaster: alert0@example.com +delay: alert0@example.com +virus: alert0@example.com +~~~ + +Pour un MX secondaire, on met souvent des restrictions plus importantes et on active moins d'alertes : +~~~ +notify_classes = resource, software +error_notice_recipient = error +~~~ + +Récupérer à la fois l'adresse expéditeur et destinataire dans les logs : +~~~ +grep "blocked using FBLW15" /var/log/mail.log | cut -d " " -f 6 | tr -d ':' | while read msgid; do grep $msgid /var/log/mail.log |grep " postfix/" |grep -E '(from|to)=<'|awk -F ' ' '{ print $1,$2,$3,$7 }' |tr -d ','; echo; done +~~~ + +### Utilisation avec un annuaire LDAP + +Les bases de données d'utilisateurs et de leurs paramètres peuvent être stockés dans une base de données externe. On peut ainsi utiliser une base de donnée ou un annuaire LDAP. Dans le cas de Postfix, on peut l'utiliser avec MySQL ou OpenLDAP. + +Dans le fichier main.cf de Postfix, on utilisera une configuration type : +~~~ +alias_maps = [autres bases] ldap:blabla +blabla_server_host = [serveur ldap] +blabla_search_base = [dn de base] +blabla_result_attribute = [type de champs à chercher] +~~~ + +Dans l'annuaire LDAP on a notamment des champs ressemblant à : + +~~~ +dn: uid=nnom,[dn de base] +objectClass: inetOrgPerson +objectClass: inetLocalMailRecipient +objectClass: posixAccount +sn: Nom +givenName: Prenom +cn: Nom Prenom +displayName: Nom Prenom +mailLocalAddress: pnom@example.com +uid: nnom +userPassword: **** +uidNumber: 1006 +gidNumber: 1006 +homeDirectory: /chemin_boite/ +~~~ + +Prenons un exemple d'une configuration de comptes virtuels. La configuration de Postfix peut être : + +~~~ +virtual_mailbox_domains = virtual.example.com +virtual_mailbox_base = / +virtual_mailbox_maps = ldap:ldapaliases2 +ldapaliases2_server_host = localhost +ldapaliases2_search_base = ou=Virtualmail,ou=Mail,dc=example,dc=com +ldapaliases2_bind = yes +ldapaliases2_bind_dn = cn=Manager,ou=Virtualmail,ou=Mail,dc=example,dc=com +ldapaliases2_bind_pw = ****** +ldapaliases2_query_filter = (mailLocalAddress=%s) +ldapaliases2_result_attribute = homeDirectory +~~~ + +Au niveau de l'annuaire LDAP : + +~~~ +dn: uid=mvegas,ou=Onlymail,dc=example,dc=com +objectClass: inetOrgPerson +objectClass: inetLocalMailRecipient +objectClass: posixAccount +sn: Vegas +givenName: Mister +cn: Virtual Mister +displayName: Mister Vegas +mailLocalAddress: mvegas@example.com +uid: mvegas +userPassword: **** +uidNumber: 1006 +gidNumber: 1006 +homeDirectory: /home/vmail/virtual.example.com/mvegas/ +~~~ + +Quelques remarques : + +Il faut qu'il y ait les permissions sur le homeDirectory. Dans ce cas, les répertoires seront créés automatiquement lors du premier mail reçu. + +Vous pouvez obtenir des messages de ce genre : +~~~ +warning: dict_ldap_connect: Unable to bind to server ldap://localhost:389 as : 2 (Protocol error) +~~~ + +Il faut alors ajouter au fichier _slapd.conf_ : `allow bind_v2` + + +## Support SSL/TLS + +Afin d'éviter de faire circuler en clair les informations (identifiants, contenu des messages) et de s'assurer que l'on s'adresse au bon serveur, +il est conseillé d'utiliser le support SSL/TLS de Postfix. + +Pour cela, il est nécessaire de gérer des certificats : voir [wiki:HowtoSSL] + +Voici ensuite un exemple de configuration de Postfix (fichier _main.cf_) : + +~~~ +smtpd_use_tls = yes +smtpd_tls_loglevel = 1 +smtpd_tls_key_file = /etc/ssl/private/mail.example.com.key +smtpd_tls_cert_file = /etc/ssl/certs/mail.example.com/crt +smtpd_tls_CAfile=/etc/ssl/certs/sub.class1.server.ca.pem +~~~ + +On peut ensuite vérifier l'activation en obtenant le message suivant dans une session SMTP suite à un EHLO : + +~~~ +250-STARTTLS +~~~ + +Il est ensuite pratique d'activer les ports tcp/587 (SMTP Submission) et tcp/465 (SMTPS) pour faciliter l'accès +au serveur SMTP, notamment pour les utilisateurs derrière une connexion n'autorisant pas l'accès sur le port tcp/25. +Cela s'active dans le fichier _master.cf_ : + +~~~ +submission inet n - - - - smtpd + -o smtpd_tls_security_level=encrypt + -o smtpd_sasl_auth_enable=yes + -o smtpd_client_restrictions=permit_sasl_authenticated,reject + -o milter_macro_daemon_name=ORIGINATING +smtps inet n - - - - smtpd + -o smtpd_tls_wrappermode=yes + -o smtpd_sasl_auth_enable=yes + -o smtpd_client_restrictions=permit_sasl_authenticated,reject + -o milter_macro_daemon_name=ORIGINATING +~~~ + +## Authentification SMTP + +Cette solution est décrite dans la RFC 2554 : SMTP Service Extension for Authentication. Il faut néanmoins prendre garde, car cette possibilité fait baisser le niveau de sécurité de votre service. En effet, tout repose désormais sur les paramètres d'authentification et, outre des moyens sociaux, il faut veiller à ce que ces paramètres ne soient pas interceptés, c'est-à-dire ne circulent pas en clair sur des canaux non sécurisés. Il sera donc prudent de rajouter une couche de chiffrement, ou alors d'exclure certains types d'authentification comme les types PLAIN ou LOGIN. + +Un mécanisme d'authentification souvent utilisé est SASL (Simple Authentication and Security Layer), librairie développée par le projet Cyrus. La lecture du document Cyrus SASL for System Administrators donnera des élements pour installer et configurer conrrectement une authentification basée sur la librairie Cyrus. L'installation se fera à partir des sources ou de paquets (sasl2-bin libsasl2 libsasl2-modules). Certains modules sont optionnels et permettent d'utiliser diverses méthodes d'authentification (libsasl2-modules-gssapi-heimdal libsasl2-modules-kerberos-heimdal). Sous Debian Sarge, on installera le paqut postfix-tls qui contient notamment les extensions SASL pour Postfix. + +Plusieurs bases d'authentification sont possibles selon les configurations : + +* *shadow* : authentification basée sur le fichier _/etc/shadow_ +* *pam* utilise directement les librairies PAM (on peut donc par exemple utiliser LDAP ou RADIUS) +* *pwcheck* : authentification basée sur le deamon pwcheck utilisant aussi le fichier /etc/shadow (précision pour Debian Sarge : saslauthd est dans le paquet cyrus-common) +* *saslauthd* : authentification basée sur le deamon saslauthd qui est plus flexible que pwcheck et peut utiliser PAM (mais aussi shadow, ldap, kerberos, etc,.) (précision pour Debian Sarge : saslauthd est dans le paquet sasl2-bin) + + La configuration s'effectue dans dans _/etc/default/saslauthd_ : +~~~ + START=yes + MECHANISMS="pam" + OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd" +~~~ + + Et ajouter l'utilisateur `postfix` au groupe `sasl`. + + On vérifie la validité des utilisateurs par : +~~~ + $ testsaslauthd -u username -p password +~~~ + + Note : attention, sous Debian Sarge, _testsaslauth_ ne tient apparemment pas compte du mécanisme passé en paramètre de saslauthd, c'est OK depuis Etch + + saslauthd utilise le fichier pam.d/smtp (ou pam.d/other) dans ce cas (quelques modifications sont nécessaires si Postfix est chrooté, voir section CHROOT) +* *auxprop* (ou sasldb pour SASL version 1) : utilisation de /etc/sasldb(2) + + C'est l'authentification utilisée par défaut par Postfix (si aucun paramètre pwcheck_method n'est précisé dans le smtpd.conf) + + Commandes : sasldblistusers(2), saslpasswd(2) + + Note : possibilité d'utiliser une base de données avec l'option auxprop_plugin: sql (quelques modifications sont nécessaires si Postfix est chrooté, voir section CHROOT) + + +Si vous utilisez une authentification non disponible, vous obtiendrez probablement : + +~~~ +warning: SASL authentication problem: unknown password verifier +~~~ + +Plusieurs possibilités de type d'authentification : NTLM, LOGIN, PLAIN, DIGEST-MD5, CRAM-MD5, KERBEROS4, GSSAPI, etc. + +Nous devons maintenant configurer postfix afin qu'il utilise SASL. Voir Postfix SMTP Authentification. + +Nous ajoutons les paramètres suivants : +~~~ +smtpd_sasl_auth_enable = yes +smtpd_recipient_restrictions = permit_sasl_authenticated, reject +~~~ + +Un fichier _smtpd.conf_ contiendra la méthode d'authentification et les types disponibles : +~~~ +pwcheck_method: [choix_methode] +mech_list: [choix_type] +~~~ + +Note concernant Debian Sarge : le paquet authsasld ne permet que les types PLAIN et LOGIN. Si l'on autorise un autre type, il cherchera le fichier /etc/sasldb2 (a priori, le paquet n'a pas été compilé avec les options --enable-cram --enable-digest). + +Exemple, authentification en PLAIN : +~~~ +EHLO [hostname] +AUTH PLAIN [mon_auth] +~~~ + +On obtient [mon_auth] ainsi : +~~~ +$ printf 'username\0username\0password' | openssl base64 +~~~ + +Deuxième exemple, authentification en LOGIN : +~~~ +EHLO [hostname] +AUTH LOGIN +[mon_login] +[mon_password] +~~~ + +On obtient [mon_login] et [mon_password] ainsi : +~~~ +$ printf 'username' | openssl base64 +$ printf 'password' | openssl base64 +~~~ + +Pour en savoir plus, lisez Authentification SASL avec Postfix + +On peut aussi restreindre au niveau de Postfix les types d'authentification possibles : +~~~ +smtpd_sasl_security_options = noanonymous, noplaintext +~~~ + +### Authentification client SMTP + +Postfix, lorsqu'il communique avec d'autres serveurs en tant que client, peut avoir besoin de s'authentifier. On peut donc lui passer des paramètres d'authentifications pour certains serveurs : +~~~ +smtp_sasl_auth_enable = yes +smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd +~~~ + +Le fichier sasl_passwd contiendra : + +~~~ +foo.com username:password +bar.com username +~~~ + +On peut choisir des options pour le mode compte, par exemple les types d'authentification autorisés : +~~~ +smtp_sasl_security_options = noplaintext +~~~ + +### Gestion du chroot de Postfix + +Enfermer Postfix dans un chroot permet de restreindre les accès à d'autres applications en cas de faille de sécurité. Cette protection s'indique au fichier master.cf. Par défaut, cette protection est activée sous Debian. Le répertoire de chroot se situe dans _/var/spool/postfix_ + +L'utilisation de chroot impose quelques modifications, notamment si l'on utilise l'authentification SMTP : + +* saslauthd + + Pour SASL avec la méthode saslauthd, il faut préciser la directive suivante dans le fichier _/etc/default/saslauthd_ : +~~~ + OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd" +~~~ + + Note : avant Etch, il était nécessaire de réaliser un hack de ce type : +~~~ + # mkdir /var/spool/postfix/var ; mkdir /var/spool/postfix/var/run + # mv /var/run/saslauthd/ /var/spool/postfix/var/run/ + # chown -R postfix /var/spool/postfix/var/run/saslauthd + # ln -s /var/spool/postfix/var/run/saslauthd /var/run/saslauthd +~~~ + + Ne pas oublier de mettre des droits de lecture sur les répertoires _/var/spool/postfix/var/_ et _/var/spool/postfix/var/run/_ afin d'autoriser l'utilisateur _postfix_. + L'utilisateur _postfix_ sera ajouté au groupe _sasl_ si nécessaire (si le répertoire saslauthd appartient à _root:sasl_). Sans ces changements, on obtiendra un message : +~~~ + warning: SASL authentication failure: cannot connect to saslauthd server: Permission denied +~~~ +* auxprop + + Pour SASL avec la méthode auxprop (ou sasldb) : +~~~ + # mv /etc/sasldb2 /var/spool/postfix/etc/sasldb2 + # ln -s /var/spool/postfix/etc/sasldb2 /etc/sasldb2 +~~~ +* resolv.conf + + Le fichier _/etc/resolv.conf_ est copié dans _/var/spool/postfix/etc/resolv.conf_. Il faut le tenir synchronisé en cas de modification (notamment en cas d'installation sur un réseau différent du réseau final). + +## Checklist délivérabilité + +* DKIM +* SPF +* Suppression des headers non nécessaires, qui peuvent permettre d'identifier la machine originale ayant envoyé le message (dans le cas où l'adresse IP de celle-ci aurait mauvaise réputation) +* Reverse DNS +* Optimisations pour Orange / Free / etc +* +* Adresse de retour valide + +## Logs Postfix + +L'indication _delays_ dans les logs est utile pour avoir des informations sur le temps d'envoi d'un mail : + +~~~ +delays=a/b/c/d: +a=time before queue manager, including message transmission; +b=time in queue manager; +c=connection setup time including DNS, HELO and TLS; +d=message transmission time. +~~~ + +## Divers + +### Restreindre selon le From + + +~~~ +check_recipient_access hash:/etc/postfix/protected_users, + +smtpd_restriction_classes = onlylocal +onlylocal = check_sender_access hash:/etc/postfix/onlylocal, reject + +/etc/postfix/protected_users : +lcdr@ onlylocal +~~~ + +### log2mail + +Pour être alerté en cas d'erreurs graves, voici une config pour log2mail : + +~~~ +file = /var/log/mail.log + pattern = "fatal:" + mailto = postmaster@example.com + template = /etc/log2mail/template.mail + +file = /var/log/mail.log + pattern = "panic:" + mailto = postmaster@example.com + template = /etc/log2mail/template.mail + +file = /var/log/mail.log + pattern = "No such file or directory" + mailto = postmaster@example.com + template = /etc/log2mail/template.mail + +file = /var/log/mail.log + pattern = "table lookup problem" + mailto = postmaster@example.com + template = /etc/log2mail/template.mail + +file = /var/log/mail.log + pattern = "warning: connect to Milter service" + mailto = postmaster@example.com + template = /etc/log2mail/template.mail + +file = /var/log/mail.log + pattern = "451 4.7.1 Service unavailable - try again later" + mailto = postmaster@example.com + template = /etc/log2mail/template.mail +~~~ + +### Chercher Mails entre deux date (Maildir) + +Exemple : Chercher les emails entre le 18 mai 2016 et 11 octobre 2016 +~~~ +$ find $HOME/Maildir -type f -newermt 2016-05-18 ! -newermt 2016-09-11 +~~~ \ No newline at end of file diff --git a/HowtoMail/Roundcube.md b/HowtoMail/Roundcube.md new file mode 100644 index 00000000..801704da --- /dev/null +++ b/HowtoMail/Roundcube.md @@ -0,0 +1,51 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Roundcube + + +## Plugin sieve + +~~~ +# aptitude install roundcube-plugins-extra +~~~ + +La config se fait dans _/etc/roundcube/plugins/sieverules/config.inc.php_. +Pour activer le plugin, rajouter _sieverules_ dans l'array `$rcmail_config['plugins']` (fichier _/etc/roundcube/main.inc.php_). + +## Plugin vacation + + + +Patch UTF-8 : + +## Plugin password + +Il est présent de base dans Roundcube (au moins en 0.9.5). Pour activer le plugin, rajouter 'password' dans l'array `$rcmail_config['plugins']` (fichier _/etc/roundcube/main.inc.php_). +Pour les comptes mail stockés dans LDAP il faut installer `php-net-ldap2` et mettre en place le fichier /etc/roundcube/plugins/password/config.inc.php suivant : + +~~~ + +~~~ + +## Mode debug + +/etc/roundcube/main.inc.php : + +~~~ +$rcmail_config['imap_debug'] = true; +~~~ + +~~~ +# tail -f /var/log/syslog | grep roundcube +~~~ \ No newline at end of file diff --git a/HowtoMail/Sendmail.md b/HowtoMail/Sendmail.md new file mode 100644 index 00000000..6fe0e4f7 --- /dev/null +++ b/HowtoMail/Sendmail.md @@ -0,0 +1,36 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Configuration de Sendmail + +[Site officiel](http://www.sendmail.org/) + +### Configurer le délai d'envoi des "delay mail" + +Exemple sur une machine OpenBSD sans configuration sendmail spécifique : + +~~~ +# cd /usr/share/sendmail/cf/ +# vim openbsd-localhost.mc +~~~ + +Ajouter la ligne suivante pour envoyer au bout de 240h : + +~~~ +define(`confTO_QUEUEWARN', `240h')dnl +~~~ + +Puis + +~~~ +# mv /etc/mail/localhost.cf /etc/mail/localhost.cf.bak +# make && make install +# pkill sendmail && sendmail -L sm-mta -C/etc/mail/localhost.cf -bd -q30m +~~~ + +### Configurer un "smarthost" (gateway SMTP) + +Même process, avec la ligne de configuration suivante : + +~~~ +define(`SMART_HOST',`[192.0.2.1]')dnl +~~~ diff --git a/HowtoMail/SpamAssassin.md b/HowtoMail/SpamAssassin.md new file mode 100644 index 00000000..30ce3a74 --- /dev/null +++ b/HowtoMail/SpamAssassin.md @@ -0,0 +1,49 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + + +## SpamAssassin + + +### Utilisation avec SpamPD + +Il est courant d'utiliser SpamAssassin par l'intermédiaire d'Amavisd. Cependant si pour diverses raisons on ne veut pas s'emcombrer d'Amavisd, il est possible d'utiliser un proxy SMTP, Spam Proxy Daemon (SpamPD) qui sera appelé par Postfix comme « content-filter ». + +#### Installation + +~~~ +aptitude install spampd +~~~ + +#### Configuration de SpamPD + +Fichier _/etc/default/spampd_ : +~~~ +STARTSPAMPD=1 +~~~ + +La configuration de SpamAssassin sera utilisé, mais on peut surcharger celle-ci en spécifiant un fichier de conf spécifique à SpamPD : +~~~ +ADDOPTS="--config=/etc/spampd.conf" +~~~ + +#### Intégration avec Postfix + +Fichier _/etc/postfix/main.cf_ : +~~~ +content_filter =scan:[127.0.0.1]:10025 +~~~ + +Fichier _/etc/postfix/master.cf_ : +~~~ +scan unix - - y - 10 smtp +localhost:10026 inet n - y - 10 smtpd + -o content_filter= + -o local_recipient_maps= + -o relay_recipient_maps= + -o myhostname=filter.mynetwork.local + -o smtpd_helo_restrictions= + -o smtpd_client_restrictions= + -o smtpd_sender_restrictions= + -o smtpd_recipient_restrictions=permit_mynetworks,reject + -o mynetworks=127.0.0.0/8 +~~~ \ No newline at end of file diff --git a/HowtoMailman.md b/HowtoMailman.md new file mode 100644 index 00000000..2d8ab741 --- /dev/null +++ b/HowtoMailman.md @@ -0,0 +1,89 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Mailman + +~~~ +# apt install mailman nginx fcgiwrap postfix +~~~ + +Configuration basique via le fichier /etc/mailman/mm_cfg.py + +~~~ +DEFAULT_URL_PATTERN = ' +DEFAULT_SERVER_LANGUAGE = 'fr' +~~~ + +Il faut obligatoirement définir une liste nommée "mailman" avec listmaster / mot de passe : + +~~~ +# /usr/lib/mailman/bin/newlist mailman +~~~ + +On créera également un mot de passe global (a priori pour autoriser la création de listes) : + +~~~ +# mmsitepass +~~~ + +## Configuration avec Nginx + +~~~ +server { + + listen 80; + server_name lists.example.com + root /usr/lib/cgi-bin/mailman; + + location = / { + rewrite ^ /listinfo permanent; + } + + location / { + fastcgi_split_path_info ^(/[^/]*)(.*)$; + fastcgi_pass unix:/var/run/fcgiwrap.socket; + include fastcgi.conf; + fastcgi_param PATH_INFO $fastcgi_path_info; + fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; + } + + location /mailman-icons { + alias /usr/lib/mailman/icons; + } + + location /archives { + alias /var/lib/mailman/archives/public; + autoindex on; + } + +} +~~~ + +## Configuration avec Postfix + +main.cf : + +~~~ +alias_maps = hash:/etc/aliases hash:/var/lib/mailman/data/aliases +alias_database = hash:/etc/aliases hash:/var/lib/mailman/data/aliases +mydestination = lists.example.com +transport_maps = hash:/etc/postfix/transport +mailman_destination_recipient_limit = 1 +~~~ + +transport : + +~~~ +lists.example.com mailman: +~~~ + +mm_cfg.py : + +~~~ +MTA='Postfix' +~~~ + +~~~ +# /usr/lib/mailman/bin/genaliases +# /etc/init.d/mailman restart +# /etc/init.d/postfix restart +~~~ diff --git a/HowtoMemcached.md b/HowtoMemcached.md new file mode 100644 index 00000000..ff939b64 --- /dev/null +++ b/HowtoMemcached.md @@ -0,0 +1,199 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Memcached + +Memcached est un serveur noSQL clé-valeur non persistent (il stocke tout en mémoire, et toutes les données sont donc perdues après un redémarrage). +Son utilisation typique est de mettre en cache des résultats issus de base de données, des réponses d'API, des rendus de pages, etc. + + [[BR]] + + +## Installation + +Sous Debian Squeeze, on a Memcached 1.4.5 : + +~~~ +# aptitude install memcached +~~~ + +Pour gérer du Memcached avec PHP : + +~~~ +# aptitude install php5-memcache php5-memcached +~~~ + +## Configuration + +La configuration se passe dans le fichier _memcached.conf_ : + +~~~ +-d +# Mode verbose (pour du debug) +logfile /var/log/memcached.log +-v +# -vv +# Taille mémoire (en Mo) +-m 64 +# Adresses d'écoute (à supprimer pour ouvrir de partout) +-l 127.0.0.1 +-p 11211 +-u nobody +# Nombre max de connexions +-c 1024 +~~~ + +## Exemple de script en PHP + + + +~~~ +get('my_value'); + if ($myValue == FALSE) { + echo 'Tha value is not in memcache!'; + // Adding the value in memcache for 60s + $memcache->add('my_value', "Hello World!", false, 60); + } else { + echo 'The value is in memcache and is: ' . $myValue . ''; + } +?> +~~~ + +## Test en telnet + +~~~ +$ telnet localhost 11211 +Trying 127.0.0.1... +Connected to localhost. +Escape character is '^]'. +get foo +VALUE foo 0 2 +hi +END +stats +STAT pid 8861 +(etc) +~~~ + +## Sessions PHP avec Memcached + +Memcached peut notamment être utilisé pour stocker les sessions PHP. Par exemple : + +~~~ +session.save_handler = memcached +session.save_path = "127.0.0.1:11211/" +~~~ + +...mais les développeurs de Memcached le déconseillent ! En effet, Memcached est fait pour du cache et non du stockage. +Voir + +## Instances + +Si besoin, plusieurs instances de memcached peuvent être lancées sur le serveur, sur des ports TCP différents. + +Il est nécessaire de dupliquer le fichier de configuration _/etc/memcached.conf_ (en prenant soin d'adapter les options _logfile_ et _-p_), le script d'init _/etc/init.d/memcached_ (en prenant soin d'adapter les variables _NAME_ et _DAEMONBOOTSTRAP_), et enfin le script _/usr/share/memcached/scripts/start-memcached_ qui démarre réellement Memcached après avoir parsé son fichier de configuration (en prenant soin d'adapter la variable _$etcfile_, indiquant son fichier de configuration). + +### Instances Jessie + +Sous Debian Jessie, si on utilise systemd, pour pouvoir bénéficier des instances jessie, il faut créer un template _/etc/systemd/system/memcached@.service_ : +~~~ +[Unit] +Description=memcached daemon +After=network.target + +[Service] +ExecStart=/usr/share/memcached/scripts/systemd-memcached-wrapper /etc/%p_%i.conf + +[Install] +WantedBy=multi-user.target +~~~ + +Ne plus démarrer le service memcached par defaut dans le target multi-user (~ runlevel 3) : +~~~ +rm /etc/systemd/system/multi-user.target.wants/memcached.service +~~~ + +Ensuite pour chaque instance avec un fichier de configuration _/etc/memcached_$nominstance.conf_, créer un lien symbolique vers le template dans le target multi-user : +~~~ +cd /etc/systemd/system/multi-user.target.wants/ +ln -s /etc/systemd/system/memcached@.service memcached@$nominstance.service +~~~ + +Puis +~~~ +systemctl daemon-reload +~~~ + +On peut ensuite manipuler chaque instance avec systemctl, par exemple : +~~~ +systemctl memcached@$nominstance +~~~ + +## Réplication + +Repcached est un patch pour avoir une réplication master-master entre serveurs memcached. Cependant la dernière modification date du 13/12/2011 pour la version 1.2.8 de memcached. Elle n'est visiblement plus maintenu. En squeeze on est en 1.4.5. Il n'est pas conseillé de l'utiliser en production. + +## Monitoring + + +~~~ +$ telnet localhost 11211 +Trying 127.0.0.1... +Connected to localhost. +Escape character is '^]'. +stats +STAT pid 11575 +STAT uptime 417529 +STAT time 1339577389 +STAT version 1.2.2 +STAT pointer_size 64 +STAT rusage_user 246.070000 +STAT rusage_system 849.540000 +STAT curr_items 91905 +STAT total_items 15555673 +STAT bytes 360080271 +STAT curr_connections 33 +STAT total_connections 7626105 +STAT connection_structures 376 +STAT cmd_get 8342525 +STAT cmd_set 16858359 +STAT get_hits 1700473 +STAT get_misses 6642052 +STAT evictions 412025 +STAT bytes_read 39016879520 +STAT bytes_written 3810238557 +STAT limit_maxbytes 402653184 +STAT threads 1 +~~~ + + +### Nagios + +TODO + +### Munin + +Voilà comment activer le plugin munin memcached : + +~~~ +cd /etc/munin/plugins +ln -snf /usr/share/munin/plugins/memcached_ memcached_bytes +ln -snf /usr/share/munin/plugins/memcached_ memcached_counters +ln -snf /usr/share/munin/plugins/memcached_ memcached_rates +aptitude install libcache-memcached-perl +/etc/init.d/munin-node restart +~~~ + +On peu ensuite tester le plugin : + +~~~ +munin-run memcached_bytes +munin-run memcached_counters +munin-run memcached_rates +~~~ + +Des plugins pour Munin existent pour relever diverses informations sur l'utilisation de memcache, comme la mémoire utilisée, le nombre et type de requêtes faites, le nombre de clés dans la base, etc… + +Un plugin intéressant et assez complet : diff --git a/HowtoMnogosearch.md b/HowtoMnogosearch.md new file mode 100644 index 00000000..d60f86f9 --- /dev/null +++ b/HowtoMnogosearch.md @@ -0,0 +1,34 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Mnogosearch + +ATTENTION, CE HOWTO EST HAUTEMENT EXPERIMENTAL... + +## Compilation + +Récupérer le paquet source Debian de la version 3.3.11 sur pub.evolix.net : + +~~~ +$ dget -x xxxx +~~~ + +Le compiler puis installer mnogosearch : + +~~~ +$ debuild -us -uc +# dpkg -i ../mnogosearch-common*deb ../mnogosearch-mysql*deb +~~~ + +Aller ensuite dans le répertoire "php" puis exécuter : + +~~~ +$ phpize --clean +$ phpize +$ ./configure --with-mnogosearch=../debian/tmp/usr +$ EXTRA_INCLUDES="-I../include -I../debian/mnogosearch-dev/usr/include" EXTRA_CFLASG="-L../debian/tmp/usr/lib" make +~~~ + +On a ainsi le .so pour PHP. + +En attendant un joli paquet Debian officiel pour tout ça... + diff --git a/HowtoMongoDB.md b/HowtoMongoDB.md new file mode 100644 index 00000000..fc9b273e --- /dev/null +++ b/HowtoMongoDB.md @@ -0,0 +1,823 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto mongoDB + + + + + +## Installation + +Pour installer le package Debian officiel : + +~~~ +# aptitude install mongodb +~~~ + + +Mais il existe aussi des paquets Debian distribués par MongoDB. +Pour cela on ajoutera la ligne suivante dans son fichier _sources.list_ : + +~~~ +deb dist 10gen +~~~ + +Puis : + +~~~ +# aptitude install mongodb-org-server +~~~ + +## Logrotate + +Les paquets fournis par 10gen n'ont pas de logrotate ! +Pour gérer la rotation des logs, on propose de mettre en place un script Shell du type : + +~~~ +# cat /etc/cron.daily/mongodb + +#!/bin/sh + +kill -USR1 `cat /var/lib/mongodb/mongod.lock 2>/dev/null` && sleep 1 +#gzip --best /var/log/mongodb/mongodb.log.????-??-??T??-??-?? +gzip --best /var/log/mongodb/mongod.log.????-??-??T??-??-?? +find /var/log/mongodb -name "mongodb.log.*.gz" -mtime +365 -delete + +# chown root: /etc/cron.daily/mongodb +# chmod 700 /etc/cron.daily/mongodb +~~~ + +Note : attention, mongodb-org-server 2.4 génère des logs *mongodb.log** mais en 3.2 des logs *mongod.log** + +On peut également forcer une rotation simple en ligne de commande : + +~~~ +$ mongo admin +MongoDB shell version: 2.4.9 +connecting to: admin +> db.runCommand('logRotate') +{ "ok" : 1 } +~~~ + +Plus d'infos sur + +## Configuration + +### Unité systemd + +En 3.2, le paquet mongo contient une unité systemd mais elle n'est pas compatible avec la version de systemd de Debian. On devra donc patcher l'unité ainsi. + + +~~~ +# systemctl cat mongod > /etc/systemd/system/mongod.service +# sed -i 's/ #.*//g' /etc/systemd/system/mongod.service +# sed -i '/Tasks/d' /etc/systemd/system/mongod.service +# systemctl daemon-reload +# systemctl enable mongod && systemctl start mongod +~~~ + + +### 2.6 + + +La configuration de MongoDB se trouve dans le fichier _/etc/mongodb.conf_ : + +~~~ +bind_ip = 127.0.0.1 +port = 27017 +auth = true + +#cpu = true +#verbose = true +#slowms = 42 +~~~ + +ATTENTION : la configuration de MongoDB est *très* spéciale... si vous voulez désactiver les logs verbose +par exemple, il ne faut pas faire _verbose # false_ car _verbose NIMPORTEQUOI_ active les logs verbeux !! +Il faut donc se méfier et suivre à lettre la documentation... + +## Authentification + + + +MongoDB a deux modes de fonctionnement pour l'authentification : + +* Un mode sans aucune authentification +* Un mode avec authentification + +Info : activer l'authentification génère des logs à chaque requête d'authentification qu'il n'est pas possible de désactiver avant la version 2.8 : voir + +### Mode sans aucune authentification + +La configuration sans authentification se fait ainsi : + +~~~ +noauth = true +~~~ + +Dans ce mode, il n'y a besoin d'aucun login / mot de passe pour accéder à l'ensemble des dbs, données, etc. +Ce mode est donc assez dangereux : il faut s'assurer que seuls des programmes de confiance accèdent +au port TCP de MongoDB. + +### Mode avec authentification + +ATTENTION, ce mode doit être correctement configuré (ce qui n'est pas le cas par défaut). + +La configuration doit donc être ainsi : + +~~~ +auth = true +~~~ + +Mais surtout, il faut créer (au moins) un utilisateur "admin" : + +~~~ +$ mongo +> use admin +> db.addUser("mongoadmin", "PASS") +{ + "user" : "mongoadmin", + "readOnly" : false, + "pwd" : "3882eaa67064707a7a6ae872504f310d" +} +> db.system.users.find() +{ "_id" : ObjectId("4e8e132c76a7c48c75393b81"), "user" : "mongoadmin", "readOnly" : false, "pwd" : "3882eaa67064707a7a6ae872504f310d" } +~~~ + +C'est seulement une fois ce premier utilisateur "admin" créé que l'authentication est activée !! +Si il n'est pas créé, l'authentification reste inactive... + +On peut ensuite se connecter à la base "admin" ainsi : + +~~~ +$ mongo admin -u mongoadmin -p PASS +~~~ + +Pour les accès aux base, les utilisateurs sont stockés dans la collection _system.users_ propre à chaque base. +Ainsi pour créer un utilisateur pour une base données : + +~~~ +> use mydb +> db.addUser("foo","PASS"); +~~~ + +Les utilisateurs (admin ou associés à une base de données) peuvent n'avoir qu'un accès read-only si +ils sont créés ainsi : + +~~~ +> db.addUser("foo","PASS",true); +~~~ + +Enfin, pour supprimer un utilisateur : + +~~~ +> use mydb +> db.removeUser("foo"); +~~~ + +## Utilisation + +En ligne de commande : + +~~~ +$ mongo +MongoDB shell version: 1.4.4 +url: test +connecting to: test +type "help" for help +~~~ + +Voici les opérations de base : + +~~~ +> show dbs +admin +local +test +> use foo +switched to db foo +> show collections +> db.bar.find() +> db.bar.save( { a : 1 } ) +> db.bar.save( { a : 2 } ) +> show collections +bar +system.indexes +> db.bar.find() +{ "_id" : ObjectId("4e64dbf619a27977131978ad"), "a" : 1 } +{ "_id" : ObjectId("4e64dbf919a27977131978ae"), "a" : 2 } +> db.foo.find({a:1}) +{ "_id" : ObjectId("4e0674a47888d8941034f4e1"), "a" : 1 } +> db.foo.find().limit(1) +{ "_id" : ObjectId("4e0674a47888d8941034f4e1"), "a" : 1 } +> exit +bye +~~~ + +Quelques commandes utiles : + +Voir le compteur des connexions : + +~~~ +db.serverStatus().connections +~~~ + +Modifier un champ d'un objet existant : + +~~~ +> db.bar.save( { a : 4, b : 0 } ) +> db.bar.update( { "_id" : ObjectId("4e64de8a19a27977131978b0") } , { $set : {b:1} } ) +> db.bar.update( { "_id" : ObjectId("4e64de8a19a27977131978b0") } , { $unset : {b:1} } ) +~~~ + +Voir uniquement certains champs : + +~~~ +> db.bar.find({a:1},{flip:1}) +> db.bar.find({a:1},{flip:1,flap:1}) +~~~ + +Voir plus d'objets (en évitant le _has more_) : + +~~~ +> DBQuery.shellBatchSize = 100 +> db.foo.find() +~~~ + +Requête sur des dates : + +~~~ +db.foo.find( { "date": {"$gte": ISODate("2011-12-05T00:21:00Z")} } ) +db.foo.find( { "date": {"$lt": ISODate("2011-12-05T04:00:00Z")} } ) +db.foo.find( { "date": {"$gte": ISODate("2011-12-05T00:21:00Z"), "$lt": ISODate("2011-12-05T04:00:00Z")} } ) +~~~ + +En PHP : + +~~~ +$m = new Mongo(); +$db = $m->foo; +$bar = $db->bar; +$bar->insert(array("a"=>"1","a"=>"2")); +$res = $bar->find(); +foreach ($res as $obj) { + echo $obj["a"] . "\n"; +} +~~~ + +## Sauvegarde + + + +~~~ +# mkdir /home/backup/mongodump +# cd /home/backup/mongodump +# mongodump +~~~ + +## Réplication avec replica set + +La réplication avec "replica set" nécessite au moins 3 machines : en effet, il va y avoir une élection +du master vers lequel seront faites toutes les écritures. + +### En Version 3.2 + +Si vos mongod ne sont pas sur un LAN il est recommandé de mettre en place du TLS avec +Sinon on pourra utiliser un keyfile + +*/!\ Le datadir doit être vierge.* + +#### Avec keyfile + +Créer le keyfile sur une machine et déployer sur les autres le même fichier. + +~~~ +# openssl rand -base64 755 > /etc/mongod.key +# chmod 400 /etc/mongod.key +# chown mongodb: /etc/mongod.key +~~~ + +Modifier la configuration : + +~~~ +security: + keyFile: /etc/mongod.key +replication: + replSetName: rs0 +~~~ + +Redémarrer les mongod. + +~~~ +# systemctl restart mongod +~~~ + +Se connecter et initialiser le RS. + + +~~~ +# mongo +> rs.initiate( + { + _id : "rs0", + members: [ + { _id : 0, host : "mongo1.example.net:27017" }, + { _id : 1, host : "mongo2.example.net:27017" }, + { _id : 2, host : "mongo3.example.net:27017" } + ] + } +) +~~~ + +Se connecter au master (voir avec rs.Status()) et créer un utilisateur admin et clusterAdmin. + +~~~ +# mongo +> use admin +use admin +db.createUser( + { + user: "myUserAdmin", + pwd: "abc123", + roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] + } +) +db.createUser( + { + "user" : "clusteradmin", + "pwd" : "abc123", + roles: [ { "role" : "clusterAdmin", "db" : "admin" } ] + } +) +~~~ + +Le Replica Set est maintenant en place. + +#### Avec X.509 + +TODO + +### En version 1.8 + +Soit trois machines de test avec MongoDB 1.8.2 : mongo1 (PRIMARY), mongo2 (SECONDARY), mongo3 (SECONDARY) + +Activer le paramètre suivant dans /etc/mongodb.conf : + +~~~ +# in replica set configuration, specify the name of the replica set +replSet = foo +# Enable journaling (recommended for replica set) +journal = true +~~~ + +À ce stade, on ne peut rien écrire sur les serveurs : + +~~~ +> db.test.insert({"coin": "coin"}) +not master +> rs.status() +{ + "startupStatus" : 3, + "info" : "run rs.initiate(...) if not yet done for the set", + "errmsg" : "can't get local.system.replset config from self or any seed (EMPTYCONFIG)", + "ok" : 0 +} +~~~ + + +Réinitialiser les bases sur chaque machine (attention, opération destructrice !) : + +~~~ +/etc/init.d/mongodb stop && mv /var/lib/mongodb/* /tmp && /etc/init.d/mongodb start +~~~ + +### Sur mongo1 (PRIMARY) + +Il faut ensuite s'assurer que : +- les machines communiquent bien au niveau réseau en TCP/27017 +- que les machines n'ont pas de NAT (ou alors il faudra utiliser des DNS) + +Puis on initialise la réplication via le mongo shell : + +~~~ +> config = {_id: 'foo' , members: [ {_id: 0, host: '1.2.3.4:27017'},{_id: 1, host: '1.2.3.5:27017'},{_id: 2, host: '1.2.3.6:27017'}]} +> rs.initiate(config); + { + "info" : "Config now saved locally. Should come online in about a minute.", + "ok" : 1 +} +> rs.help() +~~~ + +On peut aussi le faire étape par étape + +~~~ +> rs.initiate() +{ + "info2" : "no configuration explicitly specified -- making one", + "info" : "Config now saved locally. Should come online in about a minute.", + "ok" : 1 +} +~~~ + +Ajout des 2 SECONDARY : + +~~~ +setname:PRIMARY> rs.add("mongo2") +{ "ok" : 1 } + +setname:PRIMARY> rs.add("mongo3") +{ "ok" : 1 } +~~~ + +Consultation de l'état de la réplication sur le master : + +~~~ +setname:PRIMARY> rs.status() +{ + "set" : "setname", + "date" : ISODate("2011-08-09T15:42:54Z"), + "myState" : 1, + "members" : [ + { + "_id" : 0, + "name" : "mongo1", + "health" : 1, + "state" : 1, + "stateStr" : "PRIMARY", + "optime" : { + "t" : 1312904495000, + "i" : 1 + }, + "optimeDate" : ISODate("2011-08-09T15:41:35Z"), + "self" : true + }, + { + "_id" : 1, + "name" : "mongo2", + "health" : 1, + "state" : 2, + "stateStr" : "SECONDARY", + "uptime" : 76, + "optime" : { + "t" : 1312904495000, + "i" : 1 + }, + "optimeDate" : ISODate("2011-08-09T15:41:35Z"), + "lastHeartbeat" : ISODate("2011-08-09T15:42:54Z") + }, + { + "_id" : 2, + "name" : "mongo3", + "health" : 1, + "state" : 2, + "stateStr" : "SECONDARY", + "uptime" : 70, + "optime" : { + "t" : 1312904495000, + "i" : 1 + }, + "optimeDate" : ISODate("2011-08-09T15:41:35Z"), + "lastHeartbeat" : ISODate("2011-08-09T15:42:54Z") + } + ], + "ok" : 1 +} +~~~ + +Sur un slave : + +~~~ +SECONDARY> db.printReplicationInfo() +this is a slave, printing slave replication info. +source: 92.243.5.219:27017 + syncedTo: Sun Jan 29 2012 22:34:07 GMT+0100 (CET) + = 5744 secs ago (1.6hrs) +source: stampzz-prod01.evolix.net:27017 + syncedTo: Mon Jan 30 2012 00:09:47 GMT+0100 (CET) + = 4 secs ago (0hrs) +SECONDARY> use local +switched to db local +SECONDARY> db.oplog.rs.stats() +{ + "ns" : "local.oplog.rs", + "count" : 9616448, + "size" : 1166277368, + "avgObjSize" : 121.27943373686418, + "storageSize" : 1320140800, + "numExtents" : 1, + "nindexes" : 0, + "lastExtentSize" : 1320140800, + "paddingFactor" : 1, + "flags" : 0, + "totalIndexSize" : 0, + "indexSizes" : { + + }, + "capped" : 1, + "max" : 2147483647, + "ok" : 1 +} +~~~ + +Création d'un enregistrement de test : + +~~~ +setname:PRIMARY> db.foo.save({a:1}) +setname:PRIMARY> +~~~ + +### Sur mongo2 ou mongo3 (SECONDARY) + +Autorise le SECONDARY à traiter des requêtes : + +~~~ +setname:SECONDARY> rs.slaveOk() +~~~ + +Vérification de la présence de l'enregistrement de test : + +~~~ +setname:SECONDARY> db.foo.find() +{ "_id" : ObjectId("4e41558da08ccc36090745be"), "a" : 1 } +~~~ + +### Sortir un mongo de la réplication + +Voici les étapes pour sortir un mongo de la réplication : + +1. Sauvegarder (mongodump) +1. Stopper MongoDB +1. Sauvegarder les datas +1. Supprimer les fichiers local.* +1. Désactiver les replica dans la configuration +1. Relancer MongoDB + +### Resynchroniser un mongo slave + +En cas de soucis, il peut être nécessaire de resynchroniser complètement un serveur MongoDB +par rapport à un master. Il suffit de supprimer complètement le _dbpath_ : + +~~~ +# /etc/init.d/monogdb stop +# mv /var/lib/mongodb /var/lib/mongodb.old +# mkdir /var/lib/mongodb +# chown mongodb:mongodb /var/lib/mongodb +# chmod 750 /var/lib/mongodb +# /etc/init.d/monogdb start +~~~ + +Le serveur slave repassera en RECOVERING puis en SECONDARY : + +~~~ +RECOVERING> db.printReplicationInfo() +this is a slave, printing slave replication info. +source: master.example.com:27017 + syncedTo: Thu Jan 01 1970 01:00:00 GMT+0100 (CET) + = 1327878874 secs ago (368855.24hrs) +source: otherslave.example.com:27017 + syncedTo: Mon Jan 30 2012 00:14:09 GMT+0100 (CET) + = 25 secs ago (0.01hrs) +SECONDARY> db.printReplicationInfo() +configured oplog size: 1025.1384765625MB +log length start to end: 741secs (0.21hrs) +oplog first event time: Mon Jan 30 2012 00:14:09 GMT+0100 (CET) +oplog last event time: Mon Jan 30 2012 00:26:30 GMT+0100 (CET) +now: Mon Jan 30 2012 00:27:26 GMT+0100 (CET) +~~~ + +### Erreurs de synchronisation + +En cas d'erreur du type : + +~~~ + "optimeDate" : ISODate("2012-01-29T21:34:07Z"), + "lastHeartbeat" : ISODate("2012-01-29T23:02:43Z"), + "pingMs" : 11, + "errmsg" : "syncTail: 0 assertion db/pdfile.cpp:1881, syncing: { ts: Timestamp 1327872847000|109, h: -1582883220170752094, op: \"i\", ns: \"DB_MONGODB.tmp.mr.COLL_MONGODB_396779\", o: { _id: \"#colorsplash\", value: 1.0 } }" +~~~ + +Côté slave, on a plus de détails : + +~~~ +[rsSync] replHandshake res not: 1 res: { ok: 1.0 } +[rsSync] local.oplog.rs Assertion failure !loc.isNull() db/pdfile.cpp 1881 +0x57eeb6 0x589d6b 0x8a2746 0x82f486 0x821d8d 0x8231d8 0x82439a 0x824820 0xaa4560 0x7f1a33ef08ba 0x7f1a334ac02d + /usr/bin/mongod(_ZN5mongo12sayDbContextEPKc+0x96) [0x57eeb6] + /usr/bin/mongod(_ZN5mongo8assertedEPKcS1_j+0xfb) [0x589d6b] + /usr/bin/mongod() [0x8a2746] + /usr/bin/mongod(_ZN5mongo11_logOpObjRSERKNS_7BSONObjE+0x236) [0x82f486] + /usr/bin/mongod(_ZN5mongo11ReplSetImpl8syncTailEv+0xced) [0x821d8d] + /usr/bin/mongod(_ZN5mongo11ReplSetImpl11_syncThreadEv+0xc8) [0x8231d8] + /usr/bin/mongod(_ZN5mongo11ReplSetImpl10syncThreadEv+0x4a) [0x82439a] + /usr/bin/mongod(_ZN5mongo15startSyncThreadEv+0xa0) [0x824820] + /usr/bin/mongod(thread_proxy+0x80) [0xaa4560] + /lib/libpthread.so.0(+0x68ba) [0x7f1a33ef08ba] + /lib/libc.so.6(clone+0x6d) [0x7f1a334ac02d] +[rsSync] replSet syncTail: 0 assertion db/pdfile.cpp:1881, syncing: { ts: Timestamp 1327872847000|109, h: -1582883220170752094, op: "i", ns: "DB_MONGODB.tmp.mr.COLL_MONGODB_396779", o: { _id: "#colorsplash", value: 1.0 } } +~~~ + +Cela semble être une corruption de la base côté slave... +L'une des solutions consiste à resynchroniser complètement la base +(voir plus haut). + + +### Forcer à changer de master + +~~~ +> rs.stepDown() +~~~ + +/!\ à ne faire que si les slaves sont synchros sous peine +d'avoir un état rollback & ennuis... + +### Etat ROLLBACK + +Master devient indispo alors que les slaves n'était pas 100% synchro + + + + + + +ROLLBACK -> RECOVERY -> SECONDARY.. ou #FAIL avec Error RS102 + + + +### replicaset lag + + + + + +## Réparer la base de données en cas de crash + +Plusieurs méthodes selon cas. + +1. Si la journalisation est activé, ce qui est le cas par défaut pour les version >1.9.2 et en 64 bits. +MongoDB devrait automatiquement se servir des fichiers journaux, regardez si tout se passe bien dans les logs. +Si malheureusement ce message apparaît : + +~~~ +old lock file: mongod.lock. probably means unclean shutdown, +but there are no journal files to recover. +~~~ + +Il faut vérifier que le système de fichier est OK ! + +1. Si la journalisation n'est pas activé. + +Supprimez le verrou et démarrer mongodb avec l'option pour lancer une réparation. + +~~~ +rm /var/lib/mongodb/mongod.lock +mongod --dbpath /var/lib/mongodb/ --repairpath /tmp --repair +~~~ + +Vérifiez les droits du dbpath ! + +~~~ +chown -R mongodb:mongodb /var/lib/mongodb +~~~ + +Démarrez mongodb, lancez un mongo shell et lancer une réparation de toutes les base de données. + +~~~ +db.repairDatabase(); +~~~ + +## Mise à jour + +### 1.8 vers 2.0 + +Voici la procédure pour passer en Mongo 2.0 (version sortie en sept/oct 2011) : + +~~~ +# aptitude update +# aptitude install mongodb-10gen +~~~ + +La version 2.0 active désormais par défaut la journalisation. +Vous pouvez donc remplacer dans votre configuration : + +~~~ +journal = true +~~~ + +par : + +~~~ +# Disables write-ahead journaling +# nojournal = true +~~~ + +Il faut également mettre-à-jour ses indexes ! On le fera via le mongo shell : + +~~~ +> use foo +> db.bar.getIndexes() +[ + { + "key" : { + "_id" : 1 + }, + "ns" : "foo.bar", + "name" : "_id_", + "v" : 0 + } +] +~~~ + +Le * "v" : 0 * signifie que l'index n'est pas à jour. + +~~~ +> db.runCommand({compact : 'bar'}) +{ "ok" : 1 } +> db.bar.getIndexes() +[ + { + "v" : 1, + "key" : { + "_id" : 1 + }, + "ns" : "foo.bar", + "name" : "_id_" + } +] +~~~ + +Répéter l'opération pour toutes les collections ayant des indexes ! + + +## CAPPED + + + +## Monitoring avec MMS + +MMS (MongoDB Monitoring Service) est une service fourni gratuitement par 10gen. +*Déprécié, maintenant c'est payant et ça s'apelle MongoDB Cloud Manager* + +### Installation + +Créer un compte sur mms.10gen.com, créer un groupe et télécharger l'archive (qui contient déjà la clé API du groupe). + +La décompresser dans un dossier (et donner les droits mongodb). + +~~~ +cd /opt +tar zxvf 10gen*.tar.gz +chown -R mongodb:mongodb mms-agent +~~~ + +Installer python-bson et python-pymongo (via backports). + +/etc/apt/preferences: + +~~~ +Package: python-pymongo +Pin: release a=squeeze-backports +Pin-Priority: 999 +~~~ + +Le lancer via le compte mongodb: + +sudo -u mongodb nohup python /opt/mms-agent/agent.py > /var/log/mongodb/agent.log 2>&1 & + + +## Monitoring avec Munin + +### Créer un accès + +~~~ +use admin +db.createUser( + { + user: "monitoring", + pwd: "XXX", + roles: [ "clusterMonitor" ] + } +) +~~~ + +### Plugin mongo-munin + + + + +~~~ +# git clone /tmp/mongo-munin +# mkdir -p /usr/local/share/munin/plugins +# cp /tmp/mongo-munin/mongo_* /usr/local/share/munin/plugins +# cd /etc/munin/plugins/ +# ln -s /usr/local/share/munin/plugins/mongo_* +# chmod -R u=rwX,g=rwX,o=rX /usr/local/share/munin/ +~~~ + +/etc/munin/plugin-conf.d/mongo + + +~~~ +[mongo_*] +env.MONGO_DB_URI mongodb://monitoring:XXX@localhost:27017/admin +~~~ diff --git a/HowtoNBD.md b/HowtoNBD.md new file mode 100644 index 00000000..c33ae51f --- /dev/null +++ b/HowtoNBD.md @@ -0,0 +1,34 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowtoNBD + +Network Block Device (NBD) est un protocole client/serveur qui émule un block device au dessus du réseau. Ça permet par exemple de partager un volume d'un disque via le réseau. + +## Serveur + +Le fichier de conf est /etc/nbd-server/config. Dans la section generic on mettra user/group à root pour accéder aux devices dans /dev. + +À la manière de NFS on indiquera la liste des exports. + + +~~~ +[pi01] +exportname = /dev/usb0/pi01 +authfile = /etc/nbd-server/allow.pi01 +~~~ + +/etc/nbd-server/allow.pi00 +~~~ +192.168.42.42 +~~~ + +## Client + +Monter un volume. + + +~~~ +# nbd-client pi00 /dev/nbd0 -name pi01 +~~~ + + diff --git a/HowtoNFS.md b/HowtoNFS.md new file mode 100644 index 00000000..1a1d9005 --- /dev/null +++ b/HowtoNFS.md @@ -0,0 +1,44 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + + +## Serveur NFS + +* Installez le paquet _nfs-kernel-server_ +* Les partages se configurent dans le fichier _/etc/exports_ : +~~~ +/srv/nfs 192.0.2.4(rw,root_squash,sync,no_subtree_check) +~~~ + +Attention, sous Squeeze, il est recommandé de désactiver l'option suivante +dans le fichier /etc/default/nfs-kernel-server : + +~~~ +#RPCMOUNTDOPTS=--manage-gids +RPCMOUNTDOPTS= +~~~ + +Sinon, cela pose de gros problème avec les groupes secondaires, voir + +En Wheezy pour conserver les UID/GID il faut spécifier un domaine similaire sur le client et serveur dans /etc/idmapd.conf + +/!\ Si le serveur (une wheezy) est en NFSv4 mais pas le client (une squeeze), il faudra mettre dans /etc/default/nfs-common sur la squeeze NEED_IDMAPD=yes /!\ + +## Montage du partage + +* Dans le fichier _/etc/fstab_ : +~~~ +192.0.2.10:/srv/nfs /srv/nfs nfs rw 0 0 +~~~ + +~~~ +# mount /srv/nfs +# mount | grep nfs +192.0.2.10:/srv/nfs on /srv/nfs type nfs4 (rw,relatime,vers=4,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.0.2.4,minorversion=0,local_lock=none,addr=192.0.2.10) +~~~ + +## Forcer le NFS v3 + +Sur le client : +~~~ +192.0.2.10:/srv/nfs /srv/nfs nfs rw,nfsvers=3 0 0 +~~~ \ No newline at end of file diff --git a/HowtoNTP.md b/HowtoNTP.md new file mode 100644 index 00000000..2890d9e9 --- /dev/null +++ b/HowtoNTP.md @@ -0,0 +1,100 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto NTP + +Le protocole NTP (Network Time Protocol) permet de maintenir à l'heure un ordinateur. + +## Installation + +Installer un serveur NTP sous Linux : + +~~~ +# apt install ntp +~~~ + +On le configure via le fichier _/etc/ntp.conf_. + +## NTP sous OpenBSD + +OpenBSD installe par défaut OpenNTPD. + +Pour forcer une synchronisation immédiate : + +~~~ +# ntpd -s +~~~ + +## Serveur NTP uniquement pour la machine + +Pour un serveur utilisé uniquement pour la machine, +on aura principalement les directives suivantes : + +~~~ +# Le ou les serveurs sur lesquels on veut se synchroniser +server ntp.evolix.net + +# Cette ligne sert à autoriser le contrôle TOTAL de l'horloge pour la machine locale +# ce qui est le but recherché. +# On autorise toute requête de synchronisation DEPUIS notre serveur +restrict 127.0.0.1 +restrict ::1 + +# On interdit toute requête de synchronisation VERS notre serveur +restrict -4 ignore +restrict -6 ignore + +~~~ + +## Serveur NTP public + +Pour un serveur sur lequel viendrait se synchroniser d'autres machines : + +~~~ +# Plusieurs serveurs (de strate 2 a priori) +# Voir +server ntp1.example.com +server ntp2.example.com +server ntp3.example.com +server ntp4.example.com + +# Autoriser l'accès en lecture uniquement depuis partout +restrict -4 default kod notrap nomodify nopeer noquery +restrict -6 default kod notrap nomodify nopeer noquery + +# On autorise toujours notre propre machine à modifier son horloge +restrict 127.0.0.1 +restrict ::1 +~~~ + +## Outils + +On vérifie son bon fonctionnement via : + +~~~ +# ntpq -p + remote refid st t when poll reach delay offset jitter +============================================================================== + ntp.example.com 213.251.153.35 3 u 50 64 3 19.404 -10.832 8.768 +~~~ + +On peut voir la liste des clients qui se connectent au serveur via : + +~~~ +# ntpdc -c monlist +remote address port local address count m ver rstr avgint lstint +=============================================================================== +server1.example.com 41342 192.0.43.123 6404 3 4 1d0 27 2 +server2.example.com 34764 192.0.43.123 6412 3 4 1d0 27 2 +server3.example.com 44168 192.0.43.123 6970 3 4 1d0 25 10 +server4.example.com 58051 192.0.43.123 2495 3 4 1d0 70 16 +server5.example.com 123 192.0.43.123 2640 3 4 1d0 66 30 +~~~ + +## Courbes Munin + +Pour les serveurs utilisant un serveur NTP uniquement pour leurs besoins, Munin +intègre par défaut des scripts pour surveiller le décalage par rapport à un/des serveur(s) de +temps. Il ne reste qu'à les activer. + +Pour les serveurs NTP, les plugins ne sont pas officiels (_ntp_queries_ trouvables sur Internet...) + diff --git a/HowtoNeo4j.md b/HowtoNeo4j.md new file mode 100644 index 00000000..95f74afb --- /dev/null +++ b/HowtoNeo4j.md @@ -0,0 +1,53 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Neo4j + +## Installation + +Ajouter dans le fichier _/etc/apt/sources.list.d/neo4j.list_ : + +~~~ +deb stable/ +~~~ + +Puis importer la clé : + +~~~ +# wget -O - | apt-key add - +~~~ + +Installer ensuite neo4j et Java : + +~~~ +# aptitude update +# aptitude install neo4j openjdk-7-jre +~~~ + +## Configuration + +Configurations spécifiques : + +- Fichier /etc/default/neo4j : + +~~~ +ulimit -n 42000 +~~~ + +- S'assurer que Java 7 est bien par défaut avec `java -version` (a priori OpenJDK fonctionne malgré les warnings) + +- Si besoin de Java différente de celle par défaut, il faudra modifier JAVACMD dans le script du démon + +## Sauvegarde + +On peut réaliser un "dump" ainsi : + +~~~ +/usr/bin/neo4j-shell -readonly -host 127.0.0.1 -port 1337 -c export-graphml -t -o neo4j.graphml +~~~ + +À noter que ça nécessite l'installation d'un plugin Neo4j pour faire une sauvegarde/restauration via GraphML : + +## Monitoring + +Check HTTP sur ...en attendant mieux. + diff --git a/HowtoNetflow.md b/HowtoNetflow.md new file mode 100644 index 00000000..40a9b015 --- /dev/null +++ b/HowtoNetflow.md @@ -0,0 +1,66 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Netflow + + + +Netflow est un protocole développé par Cisco pour collecter des informations sur le trafic réseau. +On le retrouve évidemment dans les équipements Cisco, mais aussi Juniper, Linux, BSD, etc. + +Les équipements réseau exportent les données Netflow vers un serveur chargé de les collecter. +On peut par exemple installer ce serveur sous Linux. + +~~~ +# aptitude install nfdump +~~~ + +On peut ainsi lancer le démon *nfcapd* en le configurant via _/etc/default/ndump_ : +~~~ +nfcapd_start=yes +~~~ + +Par défaut, il écoute en UDP/9995 et stocke les données Netflow dans _/var/cache/nfdump_ + +Et l'on peut donc visualiser les données Netflow ainsi : + +~~~ +#Toutes les données +# nfdump -R /var/cache/nfdump/ + +#Seulement concernant l'IP 8.8.8.8 +# nfdump -R /var/cache/nfdump/ 'host 8.8.8.8' + +#Seulement l'UDP +# nfdump -R /var/cache/nfdump/ 'proto udp' + +#Seulement l'UDP concernant l'IP 8.8.8.8 +# nfdump -R /var/cache/nfdump/ 'proto udp and host 8.8.8.8' + +#Seulement les ports utilisés pour la communication entre 1.1.1.1 et 2.2.2.2 +# nfdump -R /var/cache/nfdump/ -s port "ip 1.1.1.1 and ip 2.2.2.2" + +#Seulement le 26 mars 2011 entre 22h35 et 22h40 +# nfdump -R /var/cache/nfdump/nfcapd.201103262235:nfcapd.201103262240 + +#Seulement le 26 mars 2011 entre 22h35m10s et 22h36m3s +# nfdump -R /var/cache/nfdump/nfcapd.201103262235 -t 2011/03/26.22:35:10-2011/03/26.22:36:03 + +#Les 3 premiers paquets +# nfdump -R /var/cache/nfdump/ -c 3 + +#Le top 3 des IPs source +# nfdump -R /var/cache/nfdump/ -n 3 -s srcip + +#Le top 3 des IPs source avec le plus fort trafic +# nfdump -R /var/cache/nfdump/ -n 3 -s srcip/bytes +~~~ + +Si l'emplacement de stockage a été modifié et qu'on a par exemple des données pour la machine A dans /var/cache/nfdump/A/ et pour la machine B dans /var/cache/nfdump/B/, avec des sous dossiers pour les dates. On veut regarder à la fois dans /var/cache/nfdump/A/2016/07/0X/ et /var/cache/nfdump/B/2016/07/0X/ : + +~~~ +#Les données de A et B entre le 08 juillet 2016 à 23h50 et le 09 juillet 2016 à 00h10 +# nfdump -M /var/cache/nfdump/A:B -R 2016/07/08/nfcapd.201607082350:2016/07/09/nfcapd.201607090010 +~~~ + + + diff --git a/HowtoNetworkTuning.md b/HowtoNetworkTuning.md new file mode 100644 index 00000000..99733f90 --- /dev/null +++ b/HowtoNetworkTuning.md @@ -0,0 +1,59 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto NetworkTuning + +Doc officiel du kernel : + +/!\ À partir de Linux 2.6.7 il a des routines de « tuning automatique », et il n'est pas recommandé de modifier certaines valeurs. + +## TCP + +Quelques optimisations basés sur + +~~~ +# Increase Linux autotuning TCP buffer limits +# Set max to 16MB (16777216) for 1GE and 32M (33554432) or 54M (56623104) for 10GE +# Don't set tcp_mem itself! Let the kernel scale it based on RAM. +net.core.rmem_max = 16777216 +net.core.wmem_max = 16777216 +net.core.rmem_default = 16777216 +net.core.wmem_default = 16777216 +net.core.optmem_max = 40960 +net.ipv4.tcp_rmem = 4096 87380 16777216 +net.ipv4.tcp_wmem = 4096 65536 16777216 +~~~ + + +~~~ +# Make room for more TIME_WAIT sockets due to more clients, +# and allow them to be reused if we run out of sockets +# Also increase the max packet backlog +net.core.netdev_max_backlog = 50000 +net.ipv4.tcp_max_syn_backlog = 30000 +net.ipv4.tcp_max_tw_buckets = 2000000 +net.ipv4.tcp_tw_reuse = 1 +net.ipv4.tcp_fin_timeout = 10 +~~~ + +## Carte réseau + +Augmentation du buffer de la carte réseau, cela permet de stocker plus de paquets dans son cache si le système n'y arrive plus (machine trop chargé, …). +On regarde la conf avec « -g » et on la modifie avec « -G rx N » et « -G tx N ». + +~~~ +# ethtool -g eth0 +Ring parameters for eth0: +Pre-set maximums: +RX: 4096 +RX Mini: 0 +RX Jumbo: 0 +TX: 4096 +Current hardware settings: +RX: 256 +RX Mini: 0 +RX Jumbo: 0 +TX: 256 +~~~ + +/!\ Attention ce n'est pas géré par toutes les cartes réseau. Il faut des cartes « PRO », de type Intel ou Broadcom. + diff --git a/HowtoNginx-PHP-FPM.md b/HowtoNginx-PHP-FPM.md new file mode 100644 index 00000000..f7842df4 --- /dev/null +++ b/HowtoNginx-PHP-FPM.md @@ -0,0 +1,59 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Nginx + PHP-FPM + +Nginx et PHP-FPM (FastCGI Process Manager) est un nouveau "setup" (par rapport à LAMP) pour faire fonctionner des applications PHP. + +## Installation + +~~~ +# aptitude install nginx-full php5-fpm +~~~ + +## Configuration + +La configuration de PHP-FPM se trouve dans _/etc/php5/fpm/php5-fpm.conf_. + +Voici les directives de base : + +~~~ +[global] +pid = run/php5-fpm.pid +~~~ + +On définit ensuite un ou plusieurs "pools" FPM via _/etc/php5/fpm/pool.d/*.conf_ : + + +~~~ +[www] +listen = /var/run/php5-fpm.sock +;listen = 127.0.0.1:9000 +user = www-data +group = www-data +pm = dynamic +pm.max_children = 50 +pm.start_servers = 20 +pm.min_spare_servers = 5 +pm.max_spare_servers = 35 +pm.max_requests = 0 +~~~ + +On configure maintenant Nginx, par exemple dans un Virtualhost _foo_ : + +~~~ +server { + listen 80; + server_name www.example.com example.com; + root /home/foo/www; + index index.html index.php; + + location ~ \.php$ { + try_files $uri =404; + #fastcgi_pass 127.0.0.1:9000; + fastcgi_pass unix:/var/run/php5-fpm.sock; + fastcgi_param SCRIPT_FILENAME /home/foo/www$fastcgi_script_name; + include fastcgi_params; + } + +} +~~~ diff --git a/HowtoNginx-Proxy-POP-IMAP.md b/HowtoNginx-Proxy-POP-IMAP.md new file mode 100644 index 00000000..18175212 --- /dev/null +++ b/HowtoNginx-Proxy-POP-IMAP.md @@ -0,0 +1,5 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto proxy POP/IMAP via Nginx + + \ No newline at end of file diff --git a/HowtoNginx.md b/HowtoNginx.md new file mode 100644 index 00000000..6e8355ee --- /dev/null +++ b/HowtoNginx.md @@ -0,0 +1,286 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Nginx + + + +## Installation + +Sous Debian on peut installer la version 1.2.1 (Wheezy) ou 1.6.2 (Jessie) : + +~~~ +# aptitude install nginx +~~~ + +## Configuration + +### Configuration de base + +La configuration principale se fait dans le fichier /etc/nginx/nginx.conf + +~~~ +user www-data; +worker_processes 8; + +error_log /var/log/nginx/error.log; +pid /var/run/nginx.pid; + +events { + worker_connections 10240; +} + +http { + keepalive_timeout 15; +[...] +~~~ + +L'un des paramètres à ajuster immédiatement est le *worker_processes*. Les _worker processes_ sont les processus fils lancés par le père (le coeur de nginx), ce sont eux qui font tout le travail, ils ne sont pas multi-threadé. *Il est recommandé de mettre autant de _worker processes_ que de cores disponibles sur votre serveur.* (cf /proc/cpuinfo) + +~~~ +worker_processes 16; +~~~ + +On peut également mettre des paramètres système dans le fichier /etc/defaut/nginx +On ajustera ainsi le max open files : + +~~~ +# cat /etc/default/nginx +ulimit -n 305855 +~~~ + +Enfin, on peut déléguer un certain nombre d'options générales dans des fichiers /etc/nginx/conf.d/*.conf + +~~~ +# cat /etc/nginx/conf.d/evolix.conf + +# disable Nginx version +server_tokens off; + +# GZIP +gzip_types text/css application/x-javascript text/javascript; +gzip_comp_level 5; +# +gzip_buffers 16 8k; + +# HTTP cache +expires 12h; + +# useful for multi-servers +add_header X-Server $hostname; + +~~~ + +### Valider la configuration + +Avant de redémarrer le serveur, vérifier que vous n'ayez pas introduit des erreurs de syntaxes dans la configuration + +~~~ +# nginx -t -c /etc/nginx/nginx.conf +configuration file /etc/nginx/nginx.conf test is successful +~~~ + +### Stats Munin + +Ajouter dans la configuration Nginx : + +~~~ + location /nginx_status_NNNN { + stub_status on; + access_log off; + allow 127.0.0.1; + allow ; + deny all; + } +~~~ + +Puis dans la configuration Munin : + +~~~ +[nginx*] +env.url +~~~ + +On peut ainsi activer les plugins _nginx_request_ et _nginx_status_ : + +~~~ +# cd /etc/munin/plugins +# ln -s /usr/share/munin/plugins/nginx_request nginx_request +# ln -s /usr/share/munin/plugins/nginx_status nginx_status +~~~ + +### Rewrite Rule + + + +Voici un exemple de ré-écriture : + +~~~ +rewrite ^regex$ /vers-cette/uri.exemple.php {last,break,permanent,redirect} +~~~ + + +### Ajout d'un alias + +Les alias permettent de faire servir du contenu qui ne serait pas stocké dans un répertoire servi par nginx (/var/www/nginx par exemple). + +~~~ + location /crossdomain.xml { + alias /home/chemin/du/fichier.xml; + } +~~~ + +### Différence entre la directive alias et root + +L'alias redirige la requête initial sans le chemin complet tandis que la directive root passe en paramètre le chemin complet. + +Exemple : + +~~~ +location /i/ { + alias /spool/w3/images/; +} +~~~ + +Une requête sur /i/image.png, nginx renverra le contenu de /spool/w3/images/image.png tandis qu'avec la directive root, elle renverra le contenu de /spool/w3/images/*i*/image.png + +### Restrictions d'accès derrière un proxy (Varnish par exemple) + +Les restrictions d'IPs ne peuvent pas se baser sur le contenu des headers, il faut passer par un module tiers (fourni avec la version nginx-extras) "Real IP". +Il permet de substituer l'adresse IPs d'origine par celle notre choix, et notamment celle contenu dans le header "X-Forwarded-for" : +~~~ +set_real_ip_from 127.0.0.1; # À remplacer par l'IP du proxy +real_ip_recursive on; +real_ip_header X-Forwarded-For; +~~~ + +### Authentification HTTP + + + +Pour configurer une authentification HTTP, on ajoutera les lignes suivantes au sein d'une directive _location_ : + +~~~ + auth_basic "Restricted"; + auth_basic_user_file /home/foo/.htpasswd; +~~~ + +Attention, si l'on ne souhaite protéger tout le site (location /), il faudra se méfier et bien ajuster +la configuration pour s'assurer que tous les fichiers sont protégés (notamment les fichiers PHP par exemple). + +Le fichier _.htpasswd_ étant généré avec l'utilitaire htpasswd (comme pour Apache). Bien vérifier les droits en lecture pour l'utilisateur qui fait tourner Nginx (www-data en général). + +## Optimisation + +### Worker Connections et Keep Alive + +Il s'agit du nombre de connexions qu'un _worker processes_ peut gérer. Le nombre de connexions multiplié par le nombre de _worker processes_ détermine le nombre total de connexions qu'il est possible de gérer simultanément. Cependant un autre paramètre intervient, il s'agit du _keep-alive time-out_ qui détermine la durée d'une connexion d'un client : lorsqu'un client se connecte au site, la connexion établie n'est pas fermée tout de suite, cela permet de faire passer plusieurs requêtes dans une seule connexion. La connexion sera fermée après le timeout. Il faut donc ajuster ces 2 paramètres en fonction de votre site (astuce : surveiller ses courbes Munin puis ajuster ces paramètres). Une configuration classique est de mettre 10240 en _worker_connections_ et entre 10 et 20 secondes pour _keepalive_timeout_. + +~~~ +events { + worker_connections 10240; +} +http { + keepalive_timeout 15; +[...] +~~~ + +Si l'on souhaite désactiver complètement le Keep Alive, on mettra _keepalive_timeout 0_ + +### Diminuer les I/O + +Afin d'éviter un goulot d'étranglement sur les I/O, on peut via certains paramètres réduire les accès disques, et donc optimiser l'I/O pour servir le contenu web. + +#### Access Logs + +À chaque requête nginx écrit dans le fichier d'access logs. Plus il y a de requêtes plus cela est coûteux en accès disque. *Il est donc recommandé d'écrire les access logs dans la mémoire RAM (via une ramdisk par exemple), et de faire un logrotate sur le disque une fois une certaine taille atteinte.* + +#### Error Logs + +Ne pas oublier de désactiver le mode verbose/debug lorsque le serveur est en production… + +#### Open File Cache + +Détermine le nombre de fichiers ouverts à mettre en cache. + +#### Buffers + +Si les tampons mémoire ne sont pas assez grands, nginx va devoir écrire dans des tampons temporaires sur le disque dur ce qui augmentent les accès disques. + +La directive _client_body_buffer_size_ détermine la taille du buffer du champ _body_ d'une requête d'un client. Selon cas il peut être intéressant de l'accorder avec une taille en concordance avec vos formulaires, typiquement si vous avez des gros formulaires avec des données à uploader il faudra augmenter le buffer. + +La directive _fastcgi_buffers_ et _proxy_buffers_ sont les buffers associés à php/cgi/… Le concept est le même que le buffer pour les clients. Si les tampons sont trop petit, les données vont être temporairement écrite sur le disque. + +#### Activer la compression gzip + +Cette directive permet au visiteur de télécharger des données compressés par le serveur, permettant d'alléger la bande passante. *Il est recommandé de mettre gzip_comp_level à 4-5*. + +On peut aussi servir directement des fichiers déjà compressés : voir + +## SSL + +~~~ +listen 0.0.0.0:443 ssl; +listen [::]:443 ssl; +ssl_certificate /etc/ssl/certs/ssl.example.com.crt; +ssl_certificate_key /etc/ssl/private/ssl.example.com.key; +~~~ + +Attention, ssl_certificate doit contenir toute la chaîne de certification, donc il sera nécessaire de concaténer les certificats. Par exemple, on ajoutera le certificat intermédiaire via : + +~~~ +# cd /tmp +# wget +# cat sub.class1.server.sha2.ca.pem >> /etc/ssl/certs/ssl.example.com.crt +~~~ + +Pour une configuration plus avancée, voir + +## Divers + +### Bloquer selon adresse IP + +Le but est de bloquer par adresse IP et de rediriger vers une page « Vous êtes bloqués ». + +~~~ +# Blacklisting +geo $blacklist { + default 0; + 91.224.160.35/32 1; +} + +server { +[...] + + # Blacklisting + if ($blacklist) { + rewrite ^ + } + +~~~ + +### Cross-domain pour les fonts + +~~~ + location ~* \.(eot|ttf|woff)$ { + add_header Access-Control-Allow-Origin *; + } +~~~ + +### Page personnalisé selon code erreur HTTP + +Contrairement à apache, on ne pourra indiquer une conf général à inclure qui s'appliquera pour tout les vhosts, mais il faudra ajouter l'include sur tout les fichier de confs des vhosts. + +Fichier de conf général */etc/nginx/error.conf* +~~~ +location /YYYYYY/ { + alias /var/www/; + index page.html; +} +error_page XXX /YYYYYY/; +~~~ +_Remplacer XXX par le code erreur HTTP souhaité et YYYYY par le nom de Location souhaité (URL) - vu que global à tout les vhosts, prendre une chaîne aléatoire._ + +Et pour chaque conf des vhosts */etc/nginx/sites-enabled/*.conf* : +~~~ +include /etc/nginx/error.conf; +~~~ diff --git a/HowtoNodeJS.md b/HowtoNodeJS.md new file mode 100644 index 00000000..9860aee9 --- /dev/null +++ b/HowtoNodeJS.md @@ -0,0 +1,52 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowTO NodeJS + +Nodejs est disponible en version 0.10.X sur wheezy-backports et jessie. + +Pour installer une version plus récente (ex: 4.X ou 5.X), on peut utiliser les dépôts de nodesource détectable via leur script d'installation sur + +~~~ +# apt install apt-transport- +# echo "deb jessie main" >> /etc/apt/sources.list.d/nodesource.list +# curl -s | apt-key add - +# apt update +# apt-show-versions nodejs -a +# apt install nodejs=xxxx +~~~ + +On peut ensuite installer des packages npm en tant qu'utilisation : + +~~~ +$ npm version +{ npm: '3.9.5', + ares: '1.10.1-DEV', + '2.7.0', + icu: '56.1', + modules: '48', + node: '6.2.2', + openssl: '1.0.2h', + uv: '1.9.1', + v8: '5.0.71.52', + zlib: '1.2.8' } +$ npm list +~ +??? (empty) + +$ npm install ping +ping@0.1.10 node_modules/ping +??? q@1.4.1 + +$ npm list +~ +??? ping@0.1.10 + ??? q@1.4.1 +~~~ + +Pour l'installation de module npm globaux, disponible via /usr/bin/$nom_modules (ex: on met à jour npm via lui même) : + +~~~ +npm install -g +chown -R root: /usr/lib/node_modules/ +chmod -R 755 /usr/lib/node_modules/ +~~~ \ No newline at end of file diff --git a/HowtoOpenBSD/CARP.md b/HowtoOpenBSD/CARP.md new file mode 100644 index 00000000..ad69cd2c --- /dev/null +++ b/HowtoOpenBSD/CARP.md @@ -0,0 +1,124 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto CARP sous OpenBSD + + + +Le principe est d'avoir une interface sur 2 machines (ou plus). Cette interface est configurée pour être dans un état MASTER ou SLAVE. +L'interface MASTER émet régulièrement des paquets à destination du SLAVE pour prouver qu'elle fonctionne bien. +Le choix SLAVE/MASTER est effectué grâce à des priorités configurables. +Si le SLAVE ne reçoit pas un paquet dans les temps (ou qu'il reçoit un paquet inférieur à sa priorité), il passera MASTER. + +## Création manuelle + +Sur le MASTER : + +~~~ +# sysctl -w net.inet.carp.allow=1 +# ifconfig carp0 create +# ifconfig carp0 vhid 1 pass PASSWORD carpdev bnx0 \ + advskew 1 192.0.2.30 netmask 255.255.255.224 +~~~ + +Sur le SLAVE : + +~~~ +# sysctl -w net.inet.carp.allow=1 +# ifconfig carp0 create +# ifconfig carp0 vhid 1 pass PASSWORD carpdev bnx0 \ + advskew 128 192.0.2.30 netmask 255.255.255.224 +~~~ + +## Création définitive + +Sur le MASTER : + +~~~ +# cat /etc/hostname.carp0 +192.0.2.30/27 carpdev bnx0 pass PASSWORD vhid 1 advskew 1 +~~~ + +Sur le SLAVE : + +~~~ +# cat /etc/hostname.carp0 +192.0.2.30/27 carpdev bnx0 pass PASSWORD vhid 1 advskew 128 +~~~ + +## Bascule CARP + +Pour des raisons de maintenance, on peut vouloir forcer une bascule CARP. +Pour faire cela, sur le master, on peut faire : + +~~~ +# ifconfig carp0 down + +ou + +# ifconfig -g carp carpdemote 50 +~~~ + + +Normalement, le master va générer un paquet CARP avec la priorité 255 ce qui doit avoir comme conséquence +que le SLAVE va immédiatemment passer MASTER. Ce paquet peut être observer avec `tcpdump proto carp` + +Note : avec "ifconfig carp0 down" nous avons eu parfois des soucis de bascule non immédiate, + on recommande donc d'observer ce qui se passer avec `tcpdump proto carp` et éventuellement + de privilégier la bascule via carpdemote qui semblerait plus sûre (à confirmer). + + +## Optimisation CARP au (re)boot d'un BACKUP + +Lorsque que l'on a un firewall en BACKUP, il est "agréable" de pouvoir le redémarrer sans que cela n'impacte le MASTER. +Pour cela, il faut bien comprendre le comportement de CARP au démarrage (c'est valable aussi quand +on le configure manuellement... ou même reconfigure... même si il est MASTER !!) : +pendant un certain temps, il va toujours rester en BACKUP pour voir si il ne reçoit pas d'annonce d'un MASTER. +Si il n'a rien reçu, il passe en MASTER. Pour ce temps est d'attente, il va utiliser sa valeur _advbase_ (par défaut à 1 seconde !). + +Conséquences de cela : +* Si vous reconfigurez une interface CARP MASTER, elle va passer en BACKUP pendant _advbase_ secondes ! + => Conseil : si vous intervenez en prod sur un CARP MASTER, mettez manuellement une valeur d'advbase faible (1 à 5 secondes) + +* Si vous redémarrez une machine avec des CARP BACKUP, il est probable que son réseau ne soit pas opérationnel immédiatement + (synchronisation Spanning Tree qui prend 50 secondes par défaut sur un switch CISCO par exemple) : l'interface va donc se + déclarer en MASTER après son temps d'attente, et c'est très embêtant si vous faites du firewalling à état ! + Il faut donc bien ajuster _advbase_ pour qu'il soit bien supérieur au temps d'arrivée du réseau. + On peut même imaginer avec une configuration en dur avec _advbase_ à 60 secondes par exemple, ce qui permet d'avoir des reboots transparents, + puis on reconfigure manuellement _advbase_ à 10 secondes par exemple quand tout est redémarré. + +## Création d'une interface CARP dans un VLAN + +On peut rattacher une interface CARP à une interface VLAN. L'instance carp0 sera alors isolée dans le VLAN auquel il est rattaché. + +Pour la création d'un VLAN, voir [wiki:HowtoOpenBSD/VLAN] + +~~~ +# cat /etc/hostname.bnx0 +up +# cat /etc/hostname.vlan42 +vlandev bnx0 description "VLAN42" +# cat /etc/hostname.carp0 +192.0.2.30/27 carpdev vlan42 pass PASSWORD vhid 1 advskew 128 +~~~ + +## Stats + +~~~ +# netstat -sp carp +carp: + 1816636 packets received (IPv4) + 684123 packets received (IPv6) + 0 packets discarded for bad interface + 0 packets discarded for wrong TTL + 0 packets shorter than header + 0 discarded for bad checksums + 0 discarded packets with a bad version + 1293450 discarded because packet too short + 2 discarded for bad authentication + 482883 discarded for unknown vhid + 0 discarded because of a bad address list + 9667 packets sent (IPv4) + 5792 packets sent (IPv6) + 0 send failed due to mbuf memory error + 35 transitions to master +~~~ diff --git a/HowtoOpenBSD/GestionDisques.md b/HowtoOpenBSD/GestionDisques.md new file mode 100644 index 00000000..037e5260 --- /dev/null +++ b/HowtoOpenBSD/GestionDisques.md @@ -0,0 +1,198 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Gestion des disques sous OpenBSD + +La gestion des disques sous OpenBSD est parfois déroutante, surtout si l'on vient du monde GNU/Linux. + +## Ajout d'un disque + +### Disque formaté pour OpenBSD (FFS) + +Si l'on ajoute un nouveau disque sur un système OpenBSD, voici les différentes étapes pour l'initialiser (outre l'installation matérielle ;-). + +Prenons l'exemple avec disque _sd1_ ajouté. Il faut d'abord initialiser sa table des partitions : + +~~~ +# fdisk -i sd1 +Do you wish to write new MBR and partition table? [n] y +Writing MBR at offset 0. +# fdisk sd1 +Disk: sd1 geometry: 60734/255/63 [975699968 Sectors] +Offset: 0 Signature: 0xAA55 + Starting Ending LBA Info: + #: id C H S - C H S [ start: size ] +------------------------------------------------------------------------------- + 0: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused + 1: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused + 2: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused +*3: A6 0 1 1 - 60733 254 63 [ 63: 975691647 ] OpenBSD +~~~ + +On gère ensuite la partie *disklabel* : + +~~~ +# disklabel -E sd1 +# Inside MBR partition 3: type A6 start 63 size 975691647 +Treating sectors 63-975691710 as the OpenBSD portion of the disk. +You can use the 'b' command to change this. + +Initial label editor (enter '?' for help at any prompt) +> a +partition: [a] +offset: [63] +size: [975691647] +FS type: [4.2BSD] +> p +OpenBSD area: 63-975691710; size: 975691647; free: 0 +# size offset fstype [fsize bsize cpg] + a: 975691647 63 4.2BSD 2048 16384 1 + c: 975699968 0 unused +> q +Write new label?: [y] +~~~ + +On peut enfin créer le système de fichiers et le monter : + +~~~ +# newfs sd1a +newfs: reduced number of fragments per cylinder group from 103664 to 103656 to enlarge last cylinder group +/dev/rsd1a: 476411.9MB in 975691644 sectors of 512 bytes +2354 cylinder groups of 202.45MB, 12957 blocks, 25984 inodes each +super-block backups (for fsck -b #) at: + 32, 414656, 829280, 1243904, ...... +# mount /dev/sd1a /mnt/ +~~~ + +### Disque en FAT32 + +Afin qu'il soit lisible par d'autres systèmes (par exemple un disque USB pour des sauvegardes), voici les différentes étapes pour +initialiser un disques en FAT32. Prenons l'exemple avec disque _sd1_ ajouté. Il faut d'abord initialiser sa table des partitions : + +~~~ +# fdisk -i sd1 + + ----------------------------------------------------- + ------ ATTENTION - UPDATING MASTER BOOT RECORD ------ + ----------------------------------------------------- + +Do you wish to write new MBR and partition table? [n] y +~~~ + +On indique ensuite que la partition est de type FAT32 : + +~~~ +# fdisk -e sd1 +Enter 'help' for information +fdisk: 1> p +Disk: sd1 geometry: 60801/255/63 [976773168 Sectors] +Offset: 0 Signature: 0xAA55 + Starting Ending LBA Info: + #: id C H S - C H S [ start: size ] +------------------------------------------------------------------------------- + 0: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused + 1: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused + 2: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused +*3: A6 0 1 1 - 60800 254 63 [ 63: 976768002 ] OpenBSD +fdisk: 1> e 3 + Starting Ending LBA Info: + #: id C H S - C H S [ start: size ] +------------------------------------------------------------------------------- +*3: A6 0 1 1 - 60800 254 63 [ 63: 976768002 ] OpenBSD +Partition id ('0' to disable) [0 - FF]: [A6] (? for help) ? +Choose from the following Partition id values: +00 unused 20 Willowsoft 67 Novell AB MacOS X boot +01 DOS FAT-12 24 NEC DOS 68 Novell AF MacOS X HFS+ +02 XENIX / 38 Theos 69 Novell B7 BSDI filesy* +03 XENIX /usr 39 Plan 9 70 DiskSecure B8 BSDI swap +04 DOS FAT-16 40 VENIX 286 75 PCIX BF Solaris +05 Extended DOS 41 Lin/Minux DR 80 Minix (old) C0 CTOS +06 DOS > 32MB 42 LinuxSwap DR 81 Minix (new) C1 DRDOSs FAT12 +07 HPFS/QNX/AUX 43 Linux DR 82 Linux swap C4 DRDOSs < 32M +08 AIX fs 4D QNX 4.2 Pri 83 Linux files* C6 DRDOSs >=32M +09 AIX/Coherent 4E QNX 4.2 Sec 84 OS/2 hidden C7 HPFS Disbled +0A OS/2 Bootmgr 4F QNX 4.2 Ter 85 Linux ext. DB CPM/C.DOS/C* +0B Win95 FAT-32 50 DM 86 NT FAT VS DE Dell Maint +0C Win95 FAT32L 51 DM 87 NTFS VS E1 SpeedStor +0E DOS FAT-16 52 CP/M or SysV 8E Linux LVM E3 SpeedStor +0F Extended LBA 53 DM 93 Amoeba FS E4 SpeedStor +10 OPUS 54 Ontrack 94 Amoeba BBT EB BeOS/i386 +11 OS/2 hidden 55 EZ-Drive 99 Mylex EE EFI GPT +12 Compaq Diag. 56 Golden Bow 9F BSDI EF EFI Sys +14 OS/2 hidden 5C Priam A0 NotebookSave F1 SpeedStor +16 OS/2 hidden 61 SpeedStor A5 FreeBSD F2 DOS 3.3+ Sec +17 OS/2 hidden 63 ISC, HURD, * A6 OpenBSD F4 SpeedStor +18 AST swap 64 NetWare 2.xx A7 NEXTSTEP FF Xenix BBT +19 Willowtech 65 NetWare 3.xx A8 MacOS X +1C ThinkPad Rec 66 NetWare 386 A9 NetBSD +Partition id ('0' to disable) [0 - FF]: [A6] (? for help) 0B +Do you wish to edit in CHS mode? [n] +offset: [63] +size: [976768002] +fdisk:*1> w +Writing MBR at offset 0. +fdisk: 1> q +~~~ + +La partition est ainsi accessible en _sd1i_ comme l'indique disklabel : + +~~~ +# disklabel sd1 +disklabel: warning, DOS partition table with no valid OpenBSD partition +# /dev/rsd1c: +type: SCSI +disk: SCSI disk +label: HM500JI +flags: +bytes/sector: 512 +sectors/track: 63 +tracks/cylinder: 255 +sectors/cylinder: 16065 +cylinders: 60801 +total sectors: 976773168 +rpm: 3600 +interleave: 1 +trackskew: 0 +cylinderskew: 0 +headswitch: 0 # microseconds +track-to-track seek: 0 # microseconds +drivedata: 0 + +16 partitions: +# size offset fstype [fsize bsize cpg] + c: 976773168 0 unused 0 0 + i: 976768002 63 MSDOS +~~~ + +Enfin, on la formate ensuite en FAT32 : + +~~~ +# newfs_msdos sd1i +/dev/rsd1i: 974863936 sectors in 121857992 FAT32 clusters (4096 bytes/cluster) +bps=512 spc=8 res=32 nft=2 mid=0xf8 spt=63 hds=255 hid=63 bsec=976768002 bspf=952016 rdcl=2 infs=1 bkbs=2 +~~~ + + +## Monter une partition FFS sous Linux + +~~~ +# mount -t ufs -o ufstype=44bsd -o ro /dev/sdb4 usb/ +~~~ + +Pour le support en RW, c'est encore expérimental d'après le message : + +~~~ +kernel: [1816288.453987] ufs was compiled with read-only support, can't be mounted as read-write +~~~ + +## Créer un swap sur un fichier image + +Exemple avec une swap de 1Go. + +~~~ +# dd if=/dev/zero of=/var/swap bs=1k count=1048576 +# chmod 600 /var/swap +# swapctl -a /var/swap +## Verifier +# swapctl -l +# echo "/var/swap /var/swap swap sw 0 0" >> /etc/fstab +~~~ diff --git a/HowtoOpenBSD/Netflow.md b/HowtoOpenBSD/Netflow.md new file mode 100644 index 00000000..531c84a8 --- /dev/null +++ b/HowtoOpenBSD/Netflow.md @@ -0,0 +1,34 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Netflow sous OpenBSD + + + + + +Netflow est un protocole développé par CISCO pour collecter des informations sur le trafic réseau. + +Les paquets Netflow sont envoyés en UDP vers un serveur chargé de collecter les informations. +Sous OpenBSD, cela s'active via : + +~~~ +# ifconfig pflow0 create +# ifconfig pflow0 flowsrc 192.0.32.10 flowdst 192.0.32.1:9995 +~~~ + +Mais il faut également marquer les paquets que l'on veut collecter avec l'état _pflow_ via PF. +En effet, c'est PF qui enverra les paquets marqués. + +Voici ainsi un pf.conf très simple pour marquer tous les paquets : + +~~~ +set skip on lo +pass keep state (pflow) +~~~ + +Pour collecter tout le trafic : + +~~~ +set state-defaults pflow +~~~ + diff --git a/HowtoOpenBSD/OSPF.md b/HowtoOpenBSD/OSPF.md new file mode 100644 index 00000000..69cd7857 --- /dev/null +++ b/HowtoOpenBSD/OSPF.md @@ -0,0 +1,265 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto OSPF sous OpenBSD + + + +IPv4 : + + + + + +IPv6 : + + + + + +OSPF est un IGP grâce auquel chaque routeur a une vue complète de la topologie du réseau. + +## Configuration + +OSPFD est installé par défaut sous OpenBSD. En IPv4, il se configure dans /etc/ospfd.conf. En IPv6, on passera par /etc/ospf6d.conf. + +Pour lancer définitivement OSPFD, on modifiera /etc/rc.conf.local : + +~~~ +# echo "ospfd_flags=" >> /etc/rc.conf.local +# echo "ospf6d_flags=" >> /etc/rc.conf.local +~~~ + +### Exemple de configuration + +Prenons 3 routeurs, placés tous les trois dans la zone 0.0.0.0, dite de backbone. +Ces 3 routeurs ont un lien entre eux via l'interface em0, et 2 d'entre eux ont une interface externe CARP partagée pour le réseau 192.0.0.0/24. + +~~~ + 130.0.0.1/24 + +---em1---+ + | | + | | + | | + +---em0---+ + .1 + + 10.0.0.0/24 + + .2 .3 ++---em0---+ +---em0---+ +| | | | +| | | | +| BACKUP | | MASTER | ++---------+ +---------+ + | | + +-----carp0-----+ + 192.0.0.1/24 +~~~ + +Voici le _ospfd.conf_ du routeur ayant l'adresse IP 10.0.0.1 : + +~~~ +# global configuration +router-id 10.0.0.1 +fib-update yes +rfc1583compat no +spf-delay msec 1000 +spf-holdtime msec 5000 + +# area +area 0.0.0.0 { + auth-type crypt + auth-md 1 "PASS" + auth-md-keyid 1 + + interface em0 { + metric 10 + retransmit-interval 5 + router-dead-time 40 + hello-interval 10 + router-priority 1 + transmit-delay 1 + } + + interface em1 { + metric 10 + passive + } +} +~~~ + +Voici le _ospfd.conf_ du routeur ayant l'adresse IP 10.0.0.2 : + +~~~ +# global configuration +router-id 10.0.0.2 +fib-update yes +rfc1583compat no +spf-delay msec 1000 +spf-holdtime msec 5000 + +# area +area 0.0.0.0 { + auth-type crypt + auth-md 1 "PASS" + auth-md-keyid 1 + + interface em0 { + metric 10 + retransmit-interval 5 + router-dead-time 40 + hello-interval 10 + router-priority 1 + transmit-delay 1 + } + + interface carp0 { + metric 10 + passive + } +} +~~~ + +Et voici le _ospfd.conf_ du routeur ayant l'adresse IP 10.0.0.3 : + +~~~ +# global configuration +router-id 10.0.0.3 +fib-update yes +rfc1583compat no +spf-delay msec 1000 +spf-holdtime msec 5000 + +# area +area 0.0.0.0 { + auth-type crypt + auth-md 1 "PASS" + auth-md-keyid 1 + + interface em0 { + metric 10 + retransmit-interval 5 + router-dead-time 40 + hello-interval 10 + router-priority 1 + transmit-delay 1 + } + + interface carp0 { + metric 10 + passive + } +} +~~~ + +L'authentification n'est possible que sous IPv4, puisqu'on passera par IPsec pour IPv6. + +Ici, le 3ème routeur sera le DR (router-id le plus élevé) et le 2ème sera le BDR. Cela signifie que chaque routeur enverra ses routes aux DR et BDR, avant que le DR ne les redistribue à tout le monde. +Si on veut garder les adresses IP des machines comme router-id tout en ne désignant pas celui qui a le router-id le plus élevé comme DR, on peut changer l'option router-priority. + +Les interfaces em0 sont donc celles sur lesquels les paquets OSPF sont envoyés afin d'établir des adjacences. +Toutes les interfaces externes sont annoncées en tant que passives pour qu'aucun paquet ne soit envoyé en dehors de notre réseau. Les interfaces carp n'ont pas besoin d'être explicitées comme passives car OSPFD les verra toujours comme telles. + +Du côté CARP, disons que le routeur 10.0.0.3 est master et 10.0.0.2 est backup. Alors OSPFD verra l'état CARP et seul le master enverra le réseau 192.0.0.0/24 aux autres routeurs. + +Les paramètres globaux fib-update, rfc1583compat, spf-delay, spf-holdtime et les paramètres d'interfaces metric, retransmit-interval, router-dead-time, hello-interval, router-priority et transmit-delay sont laissés à leur valeur par défaut et n'ont donc pas obligatoirement besoin d'être donnés. + +### Utilisation + +Voir un résumé des infos d'OSPFD : + +~~~ +# ospfctl show +Router ID: 10.0.0.1 +Uptime: 00:01:10 +RFC1583 compatibility flag is disabled +SPF delay is 1000 msec(s), hold time between two SPFs is 5000 msec(s) +Number of external LSA(s) 0 (Checksum sum 0x0) +Number of areas attached to this router: 1 + +Area ID: 0.0.0.0 + Number of interfaces in this area: 2 + Number of fully adjacent neighbors in this area: 2 + SPF algorithm executed 4 time(s) + Number LSA(s) 4 (Checksum sum 0x1ea2c) +~~~ + +Voir un résumé des infos sur les voisins : + +~~~ +# ospfctl show neighbor +ID Pri State DeadTime Address Iface Uptime +10.0.0.2 1 FULL/BCKUP 00:00:31 10.0.0.2 em0 00:00:41 +10.0.0.3 1 FULL/DR 00:00:31 10.0.0.3 em0 00:00:43 +~~~ + +Voir la FIB (Forwarding Information Base) : + +~~~ +# ospfctl show fib +flags: * # valid, O OSPF, C # Connected, S Static +Flags Prio Destination Nexthop +*C 4 10.0.0.0/26 link#6 +*O 32 192.0.0.0/24 10.0.0.3 +*C 4 130.0.0.0/24 link#5 +*C 0 127.0.0.0/8 link#0 +*S 8 127.0.0.0/8 127.0.0.1 +* 1 127.0.0.1/32 127.0.0.1 +*S 8 224.0.0.0/4 127.0.0.1 +~~~ + +En particulier la ligne **O 32 192.0.0.0/24 10.0.0.3* indiquant que l'on passe par le master pour joindre le réseau 192.0.0.0/24 obtenu par OSPF. + +Voir seulement les routes OSPF de la FIB : + +~~~ +# ospfctl show fib ospf +flags: * # valid, O OSPF, C # Connected, S Static +Flags Prio Destination Nexthop +*O 32 192.0.0.0/24 10.0.0.3 +~~~ + +Il est également possible de n'afficher que les routes statiques en remplaçant _ospf_ par _static_, ou encore d'utiliser les mots clefs _connected_ ou _interface_, ou de spécifier directement une adresse de destination. + +Voir l'état des interfaces : + +Sur 10.0.0.1, sans carp : + +~~~ +# ospfctl show interfaces +Interface Address State HelloTimer Linkstate Uptime nc ac +em1 130.0.0.1/24 DOWN - active 00:00:00 0 0 +em0 10.0.0.1/24 OTHER 00:00:08 active 00:18:06 2 2 +~~~ + +Sur 10.0.0.2, avec un carp backup : + +~~~ +# ospfctl show interfaces +Interface Address State HelloTimer Linkstate Uptime nc ac +carp0 192.0.0.1/24 DOWN - backup 00:00:00 0 0 +em0 10.0.0.2/24 BCKUP 00:00:08 active 00:18:06 2 2 +~~~ + +Sur 10.0.0.3, avec un carp master : + +~~~ +# ospfctl show interfaces +Interface Address State HelloTimer Linkstate Uptime nc ac +carp0 192.0.0.1/24 DOWN - master 00:00:00 0 0 +em0 10.0.0.3/24 DR 00:00:08 active 00:18:06 2 2 +~~~ + +En remplaçant ospfctl par ospf6ctl pour vérifier les paramètres IPv6. + +Pour que les adjacences se fassent, penser à ajouter la règle dans pf.conf afin que le traffic des multicast soit autorisé. + +En IPv4, ils communiquent de leur adresse ip em0 vers les multicast 224.0.0.5 et 224.0.0.6 : +~~~ +pass quick on em0 proto ospf from 10.0.0.0/24 to {224.0.0.5 224.0.0.6} +~~~ + +En IPv6, ils communiquent de leur adresse ip link-local em0 vers les multicast ff02::5 et ff02::6 : +~~~ +pass quick on em0 proto ospf from fe80::/64 to {ff02::5 ff02::6} +~~~ \ No newline at end of file diff --git a/HowtoOpenBSD/PFSYNC.md b/HowtoOpenBSD/PFSYNC.md new file mode 100644 index 00000000..41863033 --- /dev/null +++ b/HowtoOpenBSD/PFSYNC.md @@ -0,0 +1,28 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto PFSYNC sous OpenBSD + + + +## Stats + +~~~ +# netstat -sp pfsync +pfsync: + 89586993 packets received (IPv4) + 0 packets received (IPv6) + 0 packets discarded for bad interface + 0 packets discarded for bad ttl + 0 packets shorter than header + 0 packets discarded for bad version + 0 packets discarded for bad HMAC + 0 packets discarded for bad action + 0 packets discarded for short packet + 1 state discarded for bad values + 116211 stale states + 36304837 failed state lookup/inserts + 5465049553 packets sent (IPv4) + 0 packets sent (IPv6) + 0 send failed due to mbuf memory error + 712946959 send error +~~~ diff --git a/HowtoOpenBSD/PFStat.md b/HowtoOpenBSD/PFStat.md new file mode 100644 index 00000000..1593d2fa --- /dev/null +++ b/HowtoOpenBSD/PFStat.md @@ -0,0 +1,68 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto PFStat + +## Installation + +~~~ +# env ... +# pkg_add pfstat +~~~ + +## Configuration + +Exemple de pfstat.conf pour afficher la bande passante utilisée: + +~~~ +collect 1 = interface "bnx0" pass bytes in ipv4 diff +collect 2 = interface "bnx0" pass bytes out ipv4 diff + +image "/var/www/htdocs/pfstats/bnx0.jpg" { + from 1 days to now + width 980 height 300 + left + graph 1 bps "in" "bits/s" color 0 192 0 filled, + graph 2 bps "out" "bits/s" color 0 0 255 +} + +image "/var/www/htdocs/pfstats/bnx0-week.jpg" { + from 1 weeks to now + width 980 height 300 + left + graph 1 bps "in" "bits/s" color 0 192 0 filled, + graph 2 bps "out" "bits/s" color 0 0 255 +} + +image "/var/www/htdocs/pfstats/bnx0-month.jpg" { + from 1 months to now + width 980 height 300 + left + graph 1 bps "in" "bits/s" color 0 192 0 filled, + graph 2 bps "out" "bits/s" color 0 0 255 +} +~~~ + +On lance ensuite les crons suivants : + +~~~ +# crontab -l + +* * * * * /usr/local/bin/pfstat -q # Met a jour la base RRD +*/5 * * * * /usr/local/bin/pfstat -p # Trace les graphs +~~~ + + +Une petite page HTML pour rendre la consultation plus facile : + +~~~ + +

PFStats

+

bnx0

+

Today :

+ +

Last week :

+ +

Last month :

+ + +~~~ diff --git a/HowtoOpenBSD/PacketFilter.md b/HowtoOpenBSD/PacketFilter.md new file mode 100644 index 00000000..5628381f --- /dev/null +++ b/HowtoOpenBSD/PacketFilter.md @@ -0,0 +1,55 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowToOpenBSD/PacketFilter + +## Tips & Astuces + +Vérifier la fichier de config : + +~~~ +# pfctl -nf /etc/pf.conf +# echo $? +~~~ + +Recharger la configuration : + +~~~ +# pfctl -f /etc/pf.conf +~~~ + +Voir la QoS en temps réel : + +~~~ +# systat queue +# pfctl -s queue -vv +~~~ + +Voir les logs : + +~~~ +# tcpdump -n -e -ttt -r /var/log/pflog +~~~ + +Voir les logs en temps réel : + +~~~ +# tcpdump -n -e -ttt -i pflog0 +~~~ + +Liste des états : + +~~~ +# pfctl -s states | less +~~~ + +Flush des états : + +~~~ +# pfctl -F states +~~~ + +Toutes les infos sur PF : + +~~~ +# pfctl -sa | less +~~~ diff --git a/HowtoOpenBSD/ProxyFTP.md b/HowtoOpenBSD/ProxyFTP.md new file mode 100644 index 00000000..ca3098da --- /dev/null +++ b/HowtoOpenBSD/ProxyFTP.md @@ -0,0 +1,17 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## FTP derrière un firewall OpenBSD + +Depuis la version 4.9, qui a apporté de nombreuses modifications à PacketFilter, il semble nécessaire d'ouvrir le port 21 en provenance des clients du LAN +qui auront accès à des services FTP. +Le reste de la configuration, comprenant le daemon ftp-proxy, ne change pas. + +Un exemple de configuration simple : +~~~ +anchor "ftp-proxy/*" + +pass in quick proto tcp to port ftp rdr-to 127.0.0.1 port 8021 + +pass in on $lan_if proto tcp from $poste_autorisé to any port ftp keep state +~~~ + diff --git a/HowtoOpenBSD/RAID1.md b/HowtoOpenBSD/RAID1.md new file mode 100644 index 00000000..e0c8eade --- /dev/null +++ b/HowtoOpenBSD/RAID1.md @@ -0,0 +1,89 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowToOpenBSD/RAID1 + +*1) Démarrer sur le CD d'installation d'OpenBSD* + +*2) Entrer en mode (S)hell* + +*3) Créer le dev associer au deuxieme disque (par défault seul le premier disque est présent dans dev sous OpenBSD)* + +~~~ +# cd /dev +# sh MAKEDEV sd1 +# dd if=/dev/zero of=/dev/sd0c bs=1m count=1 +# dd if=/dev/zero of=/dev/sd1c bs=1m count=1 +# fdisk -iy sd0 +# fdisk -iy sd1 +~~~ +note : Le premier mégaoctet est utilisé par bioctl pour le RAID, donc si notre disque a été utilisé avec softraid précédemment, on utilise dd(1) pour l'effacer. + +*4) On créer ensuite une large partition sur les disques (Notez bien le FS type: RAID)* + +~~~ +# disklabel -E sd0 +Label editor (enter '?' for help at any prompt) +> a a +offset: [64] +size: [20964761] +FS type: [4.2BSD] RAID +# disklabel sd0 > structure +# disklabel -R sd1 structure +~~~ + +*5) On créer ensuite de Volume RAID1* + +~~~ +# bioctl -c 1 -l sd0a,sd1a softraid0 +~~~ + +*6) Lancer l'install* +~~~ +# install +~~~ +À l'étape de préparation du disque, choisir notre nouveau disque RAID (dans notre cas sd2) +~~~ +Available disks are: sd0 sd1 sd2. + +Which one is the root disk? (or 'done') [sd0] sd2 +~~~ +Et voilà ! + +---- + +*Pour vérifier l'état du RAID* +~~~ +# bioctl sd2 +Volume Status Size Device +softraid0 0 Online 2146656256 sd2 RAID1 + 0 Online 2146656256 0:0.0 noencl + 1 Online 2146656256 0:1.0 noencl +~~~ +*Pour sortir un disque du RAID (comme si le disque lâchait)* + +~~~ +# bioctl -O /dev/sd0a sd2 +~~~ +En rejouant la commande bioctl sd2, vous devrier voir le disque Offline. + +*Pour reconstruire le RAID après remise en place d'un nouveau disque* + + +1. D'abord préparer le disque +~~~ +# dd if=/dev/zero of=/dev/sd0c bs=1m count=1 +# disklabel -E sd0 +Label editor (enter '?' for help at any prompt) +> a a +offset: [64] +size: [20964761] +FS type: [4.2BSD] RAID +~~~ + +2. Puis lancer la reconstruction + +~~~ +# bioctl -R /dev/sd0a sd2 +~~~ + +Maintenant allons prendre un café... ou deux, ou trois... diff --git a/HowtoOpenBSD/Reseau.md b/HowtoOpenBSD/Reseau.md new file mode 100644 index 00000000..f03aec36 --- /dev/null +++ b/HowtoOpenBSD/Reseau.md @@ -0,0 +1,262 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Réseau sous OpenBSD + + + + + +## Configuration + +Configuration manuelle d'une interface : + +~~~ +# ifconfig vr0 192.0.32.10/24 +# ifconfig vr0 inet6 2a01:4:3:2::1/64 +~~~ + +Suppression d'une adresse d'une interface : + +~~~ +# ifconfig vr0 192.0.32.10/24 delete +# ifconfig vr0 inet6 2a01:4:3:2::1/64 delete +~~~ + +Configuration automatique : + +~~~ +# echo "inet 192.0.32.10 255.255.255.0" > /etc/hostname.vr0 +# echo "inet6 2a01:4:3:2::1 64" >> /etc/hostname.vr0 +~~~ + +Attention il ne s'agit pas de la même syntaxe qu'ifconfig, on ne met pas le mot clé netmask, sinon la configuration ne sera pas chargée (Voir man hostname.if) + +## Alias + +Ajouter un alias : +~~~ +# ifconfig vr0 inet alias 192.0.32.11 netmask 255.255.255.0 +~~~ + +Supprimer un alias : +~~~ +# ifconfig vr0 192.0.32.11 delete +~~~ + +## Routage + +Afficher la table de routage : +~~~ +# route -n show +~~~ + +Ajouter une route par défaut : +~~~ +# route add default 192.0.32.254 +~~~ + +Ajouter une route pour une adresse : +~~~ +# route add -host 192.0.33.42 192.0.32.253 +~~~ + +Ajouter une route pour un réseau : +~~~ +# route add 192.0.33.0/24 192.0.32.252 +~~~ + +Pour supprimer une route : +~~~ +# route delete 192.0.33.0/24 +~~~ + +Voir la route utilisée pour joindre une IP : +~~~ +# route get 8.8.8.8 +~~~ + +## Debug / résolutions de problèmes + +Voir des erreurs réseau : + +~~~ +# netstat -i +~~~ + +Voir des stats : + +~~~ +# netstat -s +~~~ + +Optimiser les buffers réseau : + +~~~ +# sysctl net.inet.tcp.recvspace=262144 +# sysctl net.inet.tcp.sendspace=262144 +# sysctl net.inet.udp.recvspace=262144 +# sysctl net.inet.udp.sendspace=262144 +~~~ + +Rappel des solutions "classiques" : soucis avec le MTU, ECN à désactiver, Window Scaling à ajuster, Autoneg à désactiver + +## PPPoE + +Via configuration : + +~~~ +# cat /etc/hostname.bge0 +description "Lien vers ADSL" +up +# cat /etc/hostname.pppoe0 +inet 0.0.0.0 255.255.255.255 NONE \ + pppoedev bge0 authproto chap \ + authname 'LOGIN' authkey 'PASS' up +dest 0.0.0.1 +inet6 +~~~ + +Manuellement : + +~~~ +# ifconfig bge0 up +# ifconfig pppoe0 0.0.0.0 255.255.255.255 \ + pppoedev bge0 authproto chap authname 'LOGIN' authkey 'PASS' up +# ifconfig pppoe0 0.0.0.0 0.0.0.1 +# ifconfig pppoe0 inet6 / +~~~ + +Pour stopper : + +~~~ +# ifconfig pppoe0 down +# ifconfig bge0 down +~~~ + +Rajouter des routes statiques vers PPPoE : + +~~~ +# route add 1.2.3.0/24 -ifp pppoe0 0.0.0.1 +~~~ + +Gestion de la route _default_ avec PPPoE (attention, on ne peut pas se servir du fichier _/etc/mygate_) : + +~~~ +# rm /etc/mygate +# echo '!route add default -ifp pppoe0 0.0.0.1' >> /etc/hostname.pppoe0 +# echo '!route add -inet6 default fe80::%pppoe0' >> /etc/hostname.pppoe0 +~~~ + +## IPv6 + +Activation de l'autoconfiguration IPv6 : + +~~~ +# sysctl -w net.inet6.ip6.accept_rtadv=1 +~~~ + +Activation de *rtadvd* pour annoncer un préfixe et un routeur. + +/etc/rtadvd.conf : + +~~~ +sis0:\ + :addr="2001:4:3:2::":prefixlen#64:raflags#64:\ + :mtu#1492 +~~~ + +Puis on le lance : + +~~~ +# rtadvd sis0 +~~~ + +ATTENTION, activer rtadvd ET l'autoconfiguration IPv6 sur la même machine (même si c'est pour des interfaces différentes) semble poser des problèmes. +Notamment l'ajout d'une adresse statique sur l'interface gérée par rtadvd n'ajoute pas de route "link" ! + +## Bridge + +/!\ Avant OpenBSD 4.7 c'était la commande brconfig, depuis la 4.7, c'est maintenant ifconfig /!\ + +Pour faire un bridge, il faut créer un fichier `/etc/hostname.bridge0` et ajouter les interfaces à bridger. Il ne faudra pas oublier de « up » les interfaces. + +/etc/hostname.bridge0 + +~~~ +add em1 +add em2 +stp em1 +stp em2 +up +~~~ + +STP permet d'activer le spanning tree. + +/etc/hostname.em1 + +~~~ +up +~~~ + +/etc/hostname.em2 + +~~~ +up +~~~ + +## Contrôle du STP + +Un rappel sur le fonctionnement : + + + + +Un simple ifconfig permet d'afficher le status. + + +~~~ +bridge0: flags=41 + groups: bridge + priority 32768 hellotime 2 fwddelay 15 maxage 20 holdcnt 6 proto rstp + em2 flags=eb + port 3 ifpriority 128 ifcost 200000 discarding role alternate + em1 flags=eb + port 2 ifpriority 128 ifcost 65535 forwarding role root + +~~~ + +On voit ici que le port em2 est bloqué, et le port em1 est le port pour contacter le bridge root. + +On pourra changer la priorité d'un bridge pour forcer le passage par lui. Par défaut ils ont une valeur identique de 32768. + + +~~~ +ifconfig bridge0 spanpriority 16384 +~~~ + +Par défaut OpenBSD est en RSTP, la bascule prend ~6. En STP, la bascule prend ~30s. + +~~~ +bridge0: flags=41 + groups: bridge + priority 0 hellotime 2 fwddelay 15 maxage 20 holdcnt 6 proto rstp + designated: id 90:e2:ba:28:b2:01 priority 0 + em2 flags=eb + port 3 ifpriority 128 ifcost 200000 forwarding role designated + em1 flags=eb + port 2 ifpriority 128 ifcost 65535 forwarding role designated + +~~~ + + +/!\ Attention, toucher au maxage et fwddelay peut causer une boucle. On déconseille de toucher à ces valeurs. + +On peut aussi changer le maxage et le fwddelay pour une bascule plus rapide. (Minimum de 6s). + + +~~~ +ifconfig bridge0 maxage 6 +ifconfig bridge0 fwddelay 6 +~~~ + +Ainsi en théorie bascule durera entre 6 et 12s. diff --git a/HowtoOpenBSD/Unbound.md b/HowtoOpenBSD/Unbound.md new file mode 100644 index 00000000..f436a3cb --- /dev/null +++ b/HowtoOpenBSD/Unbound.md @@ -0,0 +1,43 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowToOpenBSD/Unbound + +Voici la démarche à suivre pour mettre simplement en place un résolver DNS DNSSEC sous OpenBSD. + +~~~ +# cd /var/unbound/etc +# ftp ftp://FTP.INTERNIC.NET/domain/named.cache +# vim /var/unbound/etc/unbound.conf +~~~ + +Voici ce que doit contenir le fichier /var/unbound/etc/unbound.conf + +~~~ +server: + # interface sur laquelle le daemon écoute + interface: XX.XX.XX.XX + interface: 127.0.0.1 + interface: ::1 + + access-control: 0.0.0.0/0 refuse + access-control: 127.0.0.0/8 allow + # important, on précise qui pourra interroger le service + access-control: XX.XX.XX.0/24 allow + access-control: ::0/0 refuse + access-control: ::1 allow + + hide-identity: yes + hide-version: yes + + root-hints: "/var/unbound/etc/named.cache" + + auto-trust-anchor-file: "/var/unbound/db/root.key" +~~~ + +On récupère la clé racine DNSSEC, on met le flag unbound dans rc.conf.local et on démarre le daemon ! + +~~~ +# unbound-anchor -a "/var/unbound/db/root.key" +# echo "unbound_flags=\"\"" >> /etc/rc.conf.local +# /etc/rc.d/unbound start +~~~ diff --git a/HowtoOpenBSD/Upgrade46.md b/HowtoOpenBSD/Upgrade46.md new file mode 100644 index 00000000..9df00a5a --- /dev/null +++ b/HowtoOpenBSD/Upgrade46.md @@ -0,0 +1,11 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + + +## Upgrade OpenBSD 4.5 -> 4.6 + +Si PHP est utilisé, il est nécessaire d'ajouter l'option suivante au fichier /var/www/conf/php.ini pour éviter des problèmes de segfault de : + +~~~ +[suhosin] +suhosin.session.encrypt=off +~~~ diff --git a/HowtoOpenBSD/VLAN.md b/HowtoOpenBSD/VLAN.md new file mode 100644 index 00000000..314dafdb --- /dev/null +++ b/HowtoOpenBSD/VLAN.md @@ -0,0 +1,38 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto VLAN sous OpenBSD + + + +*IEEE 802.1Q/1AD* encapsulation/decapsulation pseudo-device + +## Création manuelle + +Création de 2 VLANs, 1 et 7, rattachés à l'interface bnx0 + +~~~ +# ifconfig vlan1 create +# ifconfig vlan7 create +# ifconfig vlan1 vlan 1 vlandev bnx0 +# ifconfig vlan7 vlan 7 vlandev bnx0 +~~~ + +On configure ensuite l'interface de la même manière qu'une interface classique : + +~~~ +# ifconfig vlan1 inet 10.10.10.1 netmask 255.255.255.0 +# ifconfig vlan7 inet 10.20.30.1 netmask 255.255.255.0 +~~~ + +## Création définitive + +~~~ +# cat /etc/hostname.bnx0 +up +# cat /etc/hostname.vlan1 +inet 10.10.10.1 255.255.255.0 10.10.10.255 vlandev xl0 description "VLAN1-Net1" +# cat /etc/hostname.vlan7 +inet 10.20.30.1 255.255.255.0 10.20.30.255 vlandev xl0 description "VLAN7-Net2" +~~~ + + diff --git a/HowtoOpenBSD/VRF-rtable-rdomain.md b/HowtoOpenBSD/VRF-rtable-rdomain.md new file mode 100644 index 00000000..57dfd6c8 --- /dev/null +++ b/HowtoOpenBSD/VRF-rtable-rdomain.md @@ -0,0 +1,128 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowToOpenBSD/VRF(rtable/rdomain) + +L'idée d'utiliser les VRFs (Virtual Routing and Forwarding) est d'aller plus loin dans l'isolation des flux. Depuis OpenBSD 4.9 (IPv4) et OpenBSD 5.5 (IPv6) il est possible d'utiliser des rtable pour ajouter une séparation logique, créer plusieurs tables de routage. Nous allons donc voir comment créer des tables de routage suplémentaires et comment permettre la communication entre celles-ci (VRF leaking) grâce à l'utilisation de PF. + +''' Pour créer une nouvelle table de routage (rtable). +~~~ +# route -T 1 add default 10.0.0.42 +~~~ + +En ajoutant une route dans une table inexistante, celle-ci sera créée. + +''' Pour attribuer une interface à une table de routage. +~~~ +# ifconfig vlan10 rdomain 1 +~~~ + +En attribuant une interface à une rtable, tout le trafic passant par cette interface sera "forwardé" en se basant sur les informations contenues dans celle-ci. L'ensemble d'une ou plusieurs interfaces affiliées à une rtable est appelé domaine de routage (rdomain). + +''' Une fois cela fait, on peut tester une commande en utilisant une table de routage spécifique. + +Avec ping par exemple +~~~ +# ping -V 1 10.0.0.42 +~~~ + +Certaines commandes n'ont pas d'options spécifiques, on peut alors utiliser la commande route avec le paramètre -T suivi du numéro de rtable et de exec +~~~ +# route -T 1 exec ssh 10.0.0.42 +~~~ + +''' Attribuons une autre interface dans une autre table de routage. + +Attribuons vlan20 au rdomain 2 +~~~ +# ifconfig vlan20 rdomain 2 +~~~ + +Nous avons donc maintenant em0 dans la table de routage par default, l'interface vlan10 dans la rdomain 1 et vlan20 dans la rdomain 2 + +Chaque rtable dispose donc de ses propres informations (Routes,ARP), il est donc possible par exemple de diposer de deux interfaces avec la même adresse IP. + +~~~ +# ifconfig vlan10 10.0.0.10 netmask 255.255.255.0 +# ifconfig vlan20 10.0.0.10 netmask 255.255.255.0 +~~~ + +~~~ +# ifconfig +lo0: flags=8049 mtu 32768 + priority: 0 + groups: lo + inet6 ::1 prefixlen 128 + inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4 + inet 127.0.0.1 netmask 0xff000000 +em0: flags=28843 mtu 1500 + lladdr 52:54:00:03:56:0b + priority: 0 + groups: egress + media: Ethernet autoselect (autoselect) + inet 192.168.4.241 netmask 0xffffff00 broadcast 192.168.4.255 +em1: flags=28843 mtu 1500 + lladdr 52:54:00:93:0f:aa + priority: 0 + media: Ethernet autoselect (100baseTX full-duplex) + status: active +enc0: flags=20000 + priority: 0 + groups: enc + status: active +pflog0: flags=20141 mtu 33144 + priority: 0 + groups: pflog +vlan10: flags=28843 rdomain 1 mtu 1500 + lladdr 52:54:00:93:0f:aa + priority: 0 + vlan: 10 parent interface: em1 + groups: vlan + status: active + inet 10.0.0.10 netmask 0xffffff00 broadcast 10.0.0.255 +vlan20: flags=28843 rdomain 2 mtu 1500 + lladdr 52:54:00:93:0f:aa + priority: 0 + vlan: 20 parent interface: em1 + groups: vlan + status: active + inet 10.0.0.10 netmask 0xffffff00 broadcast 10.0.0.255 +~~~ + +''' Nous allons maintenant mettre des IPs alias sur em0. + +~~~ +ifconfig em0 inet alias 192.168.4.242 netmask 255.255.255.0 +ifconfig em0 inet alias 192.168.4.243 netmask 255.255.255.0 +~~~ + +~~~ +# ifconfig em0 +em0: flags=28843 mtu 1500 + lladdr 52:54:00:03:56:0b + priority: 0 + media: Ethernet autoselect (autoselect) + inet 192.168.4.241 netmask 0xffffff00 broadcast 192.168.4.255 + inet 192.168.4.242 netmask 0xffffff00 broadcast 192.168.4.255 + inet 192.168.4.243 netmask 0xffffff00 broadcast 192.168.4.255 +~~~ + +''' Afin de permettre la communication entre différents rdomains (VRF leaking) on peut utiliser PF. + +Ici l'idée est de pouvoir communiquer avec les deux machines dans les vlans 10 et 20 depuis le réseau 192.168.4.0/24. En utilisant des règles PF on va pouvoir utiliser l'alias IP 192.168.4.243 pour communiquer aves 10.0.0.11 de la rtable1 et l'alias IP 192.168.4.242 pour communiquer aves 10.0.0.11 de la rtable2. + +~~~ +# cat /etc/pf.conf +set skip on lo + +block return # block stateless traffic +pass # establish keep-state + +match in on em0 to 192.168.4.243 rdr-to 10.0.0.11 rtable 1 +match in on em0 to 192.168.4.242 rdr-to 10.0.0.11 rtable 2 + +match out on em0 received-on vlan10 nat-to 192.168.4.243 +match out on em0 received-on vlan20 nat-to 192.168.4.242 + +match in on vlan10 to !vlan10:network rtable 0 +match in on vlan20 to !vlan20:network rtable 0 +~~~ diff --git a/HowtoOpenLDAP.md b/HowtoOpenLDAP.md new file mode 100644 index 00000000..8dbbfa37 --- /dev/null +++ b/HowtoOpenLDAP.md @@ -0,0 +1,345 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto OpenLDAP + +OpenLDAP est une implémentation libre du protocole LDAP développée par The OpenLDAP Project. + + + +## Installation + +Sous Debian Squeeze et Wheezy, on trouve la version 2.4 d'OpenLDAP. + +~~~ +# aptitude install slapd ldap-utils ldapvi shelldap +~~~ + +En wheezy bug rencontré : + +~~~ +slapd[15245]: warning: cannot open /etc/hosts.deny: Too many open files +~~~ + +Pour l'éviter ajouter dans /etc/default/slapd : + +~~~ +ulimit -n 8192 +~~~ + +## Configuration + +Depuis Debian Squeeze, OpenLDAP stocke directement sa configuration et de son schéma dans l'arborescence *cn=config*. +Notez que si vous êtes un vieux barbu fainéant, il est toujours possible d'utiliser un bon vieux _'slapd.conf_. + +Le contenu de cette arborescence est aussi stocké sous forme de fichiers, dans le répertoire _/etc/ldap/slapd.d/_, et ceux-ci sont chargés au démarrage de OpenLDAP. + +Selon vos goûts, différentes commandes pour visualiser la configuration : + +~~~ +# slapcat -b cn=config +$ ldapsearch -xLLL -b cn=config -x -D cn=admin,cn=config -W +# ldapvi -Y EXTERNAL -h ldapi:// -b cn=config +~~~ + +Note : cette dernière commande fonctionne si l'ACL (_olcAccess_) suivante est positionnée sur l'entrée _olcDatabase={0}config,cn=config_ : + +~~~ +olcDatabase={0}config,cn=config +objectClass: olcDatabaseConfig +olcDatabase: {0}config +olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage by * break +olcRootDN: cn=admin,cn=config +~~~ + +### Modifier la configuration + +On pourra donc modifier la configuration à chaud via _ldapvi_ ou tout simplement _ldapmodify_ et de superbes fichiers LDIF. + +À savoir : lorsqu'on modifie à chaud la configuration, OpenLDAP met alors immédiatement à jour le contenu du fichier correpondant dans _/etc/ldap/slapd.d/_ ! + +Une autre possibilité est de stopper _slapd_, de modifier les fichiers LDIF dans _/etc/ldap/slapd.d/_ et de le redémarrer. +Attention, cela risque de générer des warnings à propos de checksums sur les fichiers. Pour contourner cela, il faut ré-éditer les entrées à chaud pour +que les dumps soient regénérés avec les bons checksums. + +Autre détail important, avant la version 2.5 il n'est pas possible de faire un delete à chaud sur une entrée de _cn=config_ ! +Il faut donc utiliser la méthode nécessitant l'arrêt de _slapd_, faire les modifications sur les fichiers LDIF et le relancer. + +### Directives + +Pour gérer les logs, on utilise la directive _olcLogLevel_ dans l'entrée _cn=config_. + +Exemple pour désactiver les logs : + +~~~ +cn=config +olcLogLevel: 0 +~~~ + + +### Gestion des schémas + +Autrefois, il suffisait d'un simple _include_ vers un fichier .schema pour ajouter un schéma. +Mais avec la configuration dans _cn=config_, il faut désormais convertir un schéma en LDIF puis l'injecter ! + +Voici les étapes pour convertir un .schema en .ldif (exemple avec _amavis.schema_) : + +1. Créer un fichier _/tmp/convert-to-ldap.conf_ contenant une seule ligne : + +~~~ +include /etc/ldap/schema/amavis.schema +~~~ + +2. On lance la commande suivante : + +~~~ +# mkdir /tmp/convert +# slaptest -f /tmp/convert-to-ldap.conf -F /tmp/convert +config file testing succeeded +~~~ + +3. On obtient donc un fichier LDIF : _/tmp/convert/cn\=config/cn\=schema/cn\=\{0\}amavis.ldif_ + +Pour l'injecter, il faut le modifier : + +* ajouter le base DN en fin de 1ère ligne : cn=schema,cn=config +* supprimer les dernières lignes du fichier spécifiques à LDAP : structuralObjectClass, entryUUID, creatorsName, etc. +* renumérotation du _cn={0}_ (dn: et cn:) en fonction des schémas déjà existants + +On peut ainsi faire : + +~~~ +# ldapadd -Y EXTERNAL -H ldapi:/// -f /tmp/convert/cn\=config/cn\=schema/cn\=\{0\}amavis.ldif +SASL/EXTERNAL authentication started +SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth +SASL SSF: 0 +adding new entry "cn={4}amavis,cn=schema,cn=config" +~~~ + +Note : Si besoin, on peut bien sûr convertir plusieurs schémas d'un coup via un fichier _/tmp/convert-to-ldap.conf_ du type : + +~~~ +include /etc/ldap/schema/core.schema +include /etc/ldap/schema/collective.schema +[...] +include /etc/ldap/schema/monschema2.schema +~~~ + +### Gestion des ACL + +Les ACL s'ajoutent via des règles du type : + +~~~ +olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by dn="cn=admin,dc=example,dc=com" write by * none +olcAccess: {1}to dn.base="" by * read +olcAccess: {2}to * by self write by dn="cn=admin,dc=example,dc=com" write by peername.ip="127.0.0.1" read by * none +~~~ + +/!\ en cas de réplication, bien penser à inclure l'utilisateur de réplication pour les attrs=userPassword,shadowLastChange sous peine +de ne pas avoir de synchronisation des mots de passe !!! + +Pour ne pas avoir un annuaire lisible publiquement mais accessible depuis l'extérieur, on peut forcer l'authentification en remplaçant "by peername.ip="127.0.0.1" read" par : + +~~~ +by users read by anonymous auth +~~~ + +### Réplication (master->slave) + +*Sur le master :* + +* Ajouter le module syncprov (dans l'objet cn=module{0},cn=config) : +~~~ +olcModuleLoad: {1}syncprov +~~~ + +* Ajouter l'objet suivant : +~~~ +dn: olcOverlay={0}syncprov,olcDatabase={1}hdb,cn=config +objectClass: olcOverlayConfig +objectClass: olcSyncProvConfig +olcOverlay: {0}syncprov +structuralObjectClass: olcOverlayConfig +entryUUID: b5786b24-6688-1030-8824-91503a3ebf6f +creatorsName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth +createTimestamp: 20110829124650Z +entryCSN: 20110829124650.326464Z#000000#000#000000 +modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth +modifyTimestamp: 20110829124650Z +olcSpSessionlog: 100 +olcSpCheckpoint: 100 10 +~~~ + +* Créer l' _ou_ ldapuser et l'utilisateur _repl_, et lui donner les droits de lecture sur l'ensemble de l'arbre LDAP + +*Sur le slave :* + +* S'assurer que le schéma LDAP soit le même que sur le master +* Ajouter le module syncprov (dans l'objet cn=module{0},cn=config) : +~~~ +olcModuleLoad: {1}syncprov +~~~ + +* Ajouter les attributs suivants à l'objet "dn: olcDatabase={1}hdb,cn=config" : +~~~ +olcDbIndex: entryUUID eq +olcSyncrepl: {0}rid=124 provider=ldap://ldap.example.com bindmethod=simple binddn="cn=repl,ou=ldapuser,dc=example,dc=com" credentials=XXX searchbase="dc=example,dc=com" retry="60 +" type=refreshAndPersist +~~~ + +### Gestion des index LDAP + +On configure des index ainsi : + +~~~ +olcDbIndex: objectClass eq +olcDbIndex: default eq +olcDbIndex: phpgwContactOwner pres,eq,sub +olcDbIndex: uidNumber,gidNumber pres,eq +olcDbIndex: uid,mail eq,approx +~~~ + +Attention, si l'on modifie les index, il faut absolument les regénérer avec la commande suivante : + +~~~ + # /etc/init.d/slapd stop + # sudo -u openldap slapindex + # /etc/init.d/slapd start +~~~ + +### Activer SSL (LDAPS) + +Rajouter dans _cn=config_ : +~~~ +olcTLSCertificateFile: /etc/ssl/certs/ssl-cert-snakeoil.pem +olcTLSCertificateKeyFile: /etc/ssl/private/ssl-cert-snakeoil.key +olcTLSCACertificateFile: /etc/ssl/certs/cacert.pem +~~~ + +Et dans */etc/default/slapd* par exemple : + +~~~ +SLAPD_SERVICES="ldap://127.0.0.1:389/ ldapi:/// ldaps:///" +~~~ + +Suite à cette mise en place, si en tentant de se connecter au serveur apparaît l'erreur `ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)`, il se peut que ça soit dû au certificat non reconnu. Pour désactiver la vérification du certificat, sur le client, ajouter cette ligne dans _/etc/ldap/ldap.conf_ : + +~~~ +TLS_REQCERT never +~~~ + + +## Utilisation + +### ldapvi + +_ldapvi_ permet d'éditer un annuaire LDAP avec Vim. + +Pour ajouter une entrée, on fera donc : + +~~~ +$ cat add.ldif +dn: ou=test,dc=example,dc=com +ou: test +objectClass: +$ ldapadd [-h ] -D uid=xxx,ou=xxx,dc=evolix,cd=net --add --in add.ldif +add: 1, rename: 0, modify: 0, delete: 0 +Action? [yYqQvVebB*rsf+?] y +Done. +~~~ + +### .ldaprc + +Le fichier _~/.ldaprc_ est utilisé pour les outils inclus dans `ldap-utils` il permet de définir des paramètres particulier. +On peut notamment autoriser les certifications non reconnus : + +~~~ +tls_reqcert never +~~~ + + +## Backup + +Rien de plus simple : + +~~~ +slapcat -l ldap.bak +~~~ + +Cela dump l'arbre ldap dans un seul fichier LDIF. Cette sauvegarde n'inclut *pas* cn=config. + +Pour sauvegarder la configuration (ACLs, Schema...etc) : + +~~~ +slapcat -b cn=config -l config.ldif +~~~ + +## Restauration + +~~~ +/etc/init.d/slapd stop +rm -rf /var/lib/ldap/* +sudo -u openldap slapadd -l ldap.bak +/etc/init.d/slapd start +~~~ + +## Infos sur les attributs LDAP + + +### Attributs pour authentification Windows + + +*sambaPwdMustChange*: Timestamp Unix, date d'expiration du mot de passe Windows. + +*sambaKickoffTime*: Timestamp Unix, date d'expiration du compte Windows. + +*sambaPwdLastSet*: Timestamp Unix, dernière fois que le mot de passe a été changé. (Bizarrerie à ce propos...) + +### Attributs pour authentification UNIX +''' +shadowExpire''': Durée en nombre de jours depuis le 1° Janvier 1970. Date d'expiration du compte. + +*shadowInactive*: Combien de jours il faut accepter un mot de passe qui a expiré. + +*shadowWarning*: Nombre de jours avant que le mot de passe expire et où le système va avertir de la proche expiration. + +*shadowFlag*: -1 ??? + +*shadowLastChange*: Durée en nombre de jours depuis le 1° Janvier 1970 de la dernière fois que le mot de passe a été modifié (Ex: 15579 = 27/08/2012). + +*shadowMin*: Age minimum en jours avant que l'utilisateur puisse changer son mot de passe. (Défaut à 0 = quand il veut). + +*shadowMax*: Durée en jours de la validité du mot de passe. (Ex 365 = 1 an). Pour désactiver l'expiration du mot de passe, affecter la valeur -1. + +## FAQ + +### could not parse entry + +Lors d'ajout/modification d'un annuaire LDAP, si vous obtenez un message de ce type : + +~~~ +str2entry: invalid value for attributeType objectClass #0 (syntax 1.3.6.1.4.1.1466.115.121.1.38) +slapadd: could not parse entry (line=70) +structuralObjectClass: organizationalRole +~~~ + +C'est sûrement dû au fait que vos schémas spécifiques ne sont pas pris en compte car _slapd_ +utilise la configuration présente dans _/etc/ldap/slapd.d_ si le dossier est présent. + +### Insufficient access + +~~~ +Uncaught exception from user code: + Insufficient access at ./add.pl line 678, line 2. +~~~ + +Vérifier dans les acl que votre utilisateur a le droit de modifier l'attribut que vous modifier. + +### ldif_read_file: checksum error + +Si lors d'opérations slapd* (slapcat, etc), vous obtenez des messages du type : + +~~~ +53af54a7 ldif_read_file: checksum error on "/etc/ldap/slapd.d/cn=config/olcDatabase={-1}frontend.ldif" +53af54a8 ldif_read_file: checksum error on "/etc/ldap/slapd.d/cn=config/olcDatabase={0}config.ldif" +~~~ + +C'est dû au fait que vous avez modifié "à froid" la configuration dans /etc/ldap/slapd.d/ ; cela ne pose pas de problème si vous le faites bien lorsque _slapd_ est arrêté, mais cela génère ces warnings. En effet, lorsqu'une entrée est modifiée "à chaud" (via ldapvi par exemple), l'entrée est dumpée dans un fichier dans /etc/ldap/slapd.d/ et un checksum est généré. Pour contourner ce problème, il vous suffit de faire une modification à chaud de l'entrée (même inutile) afin qu'un dump soit regénéré avec son checksum correspondant. \ No newline at end of file diff --git a/HowtoOpenNMS.md b/HowtoOpenNMS.md new file mode 100644 index 00000000..66f4168d --- /dev/null +++ b/HowtoOpenNMS.md @@ -0,0 +1,88 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto OpenNMS + +OpenNMS est un outil de supervision de réseau Open Source. Il est développé en Java (eh oui...) et s’appuie sur le moteur applicatif Jetty et le SGBD PostgreSQL. + +# Installation + + + +Il faut d'abord ajouter des dépôts : + +~~~ +deb stable main +deb-src stable main +~~~ + +Et ensuite la clé GPG : + +~~~ +#wget -O - | apt-key add - +~~~ + +L'installation de OpenNMS nécessite : + +* Java +* PostgreSQL + +Pour PostgreSQL, il faut modifier la méthode d'accès à la bdd dans le fichier _/etc/postgresql/$PGVERSION/main/pg_hba.conf_ + +~~~ +# TYPE DATABASE USER ADDRESS METHOD + +# OpenNMS change: configure local, IPv4 and IPv6 connections made from localhost to not require authentication + +# "local" is for Unix domain socket connections only +local all all trust # the default method is peer +# IPv4 local connections: +host all all 127.0.0.1/32 trust # the default method is md5 +# IPv6 local connections: +host all all ::1/128 trust # the default method is md5 +# Allow replication connections from localhost, by a user with the +# replication privilege. +#local replication postgres peer +#host replication postgres 127.0.0.1/32 md5 +#host replication postgres ::1/128 md5 +~~~ + +Cela demande un redémarrage de PostgreSQL : + +~~~ +#service postgresql restart +~~~ + +Enfin on installe *OpenNMS* + +~~~ +#aptitude install opennms +~~~ + +## Configuration + +Détection de java par *OpenNMS* : + +~~~ +#/usr/share/opennms/bin/runjava -s +~~~ + +Création et configuration de la bdd : + +~~~ +#/usr/share/opennms/bin/install -dis +~~~ + +Il peut y avoir des problèmes avec les ports utilisés, on peut les modifier dans le fichier de configuration principal _/etc/opennms/opennms.properties_ mais aussi dans d'autres fichiers comme _/etc/opennms/service-configuration.xml_. + +## Utilisation + +On peut lancer le service : + +~~~ +#/usr/sbin/service opennms start +~~~ + +Maintenant pour utiliser OpenNMS il faut se rendre sur : + + + diff --git a/HowtoOpenSearchServer.md b/HowtoOpenSearchServer.md new file mode 100644 index 00000000..dca6f257 --- /dev/null +++ b/HowtoOpenSearchServer.md @@ -0,0 +1,37 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto OpenSearchServer + +## Installation OpenSearchServer + +### Installer Java + +~~~ +apt-get install openjdk-7-jdk +~~~ + +### Installer OpenSearchServer + +Télécharger la dernière version sur le site + +~~~ +dpkg -i opensearchserver-X.X.X-bXXX.deb +~~~ + +Une fois installé voici les dossiers et fichiers importants : + +/var/lib/opensearchserver: Contains all your data (indexes) +/usr/share/opensearchserver: Contains all your OSS binaries +/etc/opensearchserver: The configuration file of your OpenSearchServer instance +/etc/init.d/opensearchserver: The script used by the system to start and stop the OpenSearchServer instance. + +~~~ +/etc/init.d/opensearchserver stop +mkdir -p /home/opensearchserver/share +mkdir /home/opensearchserver/lib +mv /usr/share/opensearchserver /home/opensearchserver/share +mv /var/lib/opensearchserver /home/opensearchserver/lib +ln -s /home/opensearchserver/share/opensearchserver /usr/share/opensearchserver +ln -s /home/opensearchserver/lib/opensearchserver /var/lib/opensearchserver +service opensearchserver start +~~~ \ No newline at end of file diff --git a/HowtoOpenVZ.md b/HowtoOpenVZ.md new file mode 100644 index 00000000..afc2c059 --- /dev/null +++ b/HowtoOpenVZ.md @@ -0,0 +1,206 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto OpenVZ + +OpenVZ permet de compartimenter les processus au sein de conteneurs. Ce n'est pas vraiment de la virtualisation car un seul et même noyau est utilisé par tous les conteneurs. +Cependant un VE (Virtual Environment) ne peut voir que ses processus (un init avec un PID=1 est recréé pour chaque VE, ce qui ne perturbe pas le schéma standard des processus dans le VE). + +Le principe de conteneur permet d'obtenir de meilleures performances (un seul noyau chargé en mémoire, accès aux périphériques plus rapide (moins de couches logicielles à traverser)) +et de modifier les ressources matérielles allouées à chaud. + +Cependant, tous les systèmes virtualisés partagerons la même version du noyau et les mêmes modules. +Il ne peut donc y avoir un système Debian et un FreeBSD sur la même machine physique par exemple. + +## Configuration du système hôte (VE0) + +Au niveau du partitionement, il peut être utile de créer une partition contenant tous les VE, à monter dans _/var/lib/vz/_, étant donné que les fichiers des VE sont des _vrais fichiers_ pour le système de fichiers hôte (contrairement à d'autres solutions de virtualisation où les fichiers sont dans une image). + +Ensuite, on installe le noyau Linux avec le support d'OpenVZ (ne pas oublier de rebooter dessus après l'install avant de continuer) : +~~~ +# aptitude install linux-image-2.6-openvz-amd64 +~~~ + +Configuration du réseau : il faut activer le forwarding des paquets : + +/etc/sysctl.conf +~~~ +net.ipv4.conf.default.forwarding=1 +net.ipv4.conf.default.proxy_arp = 0 +net.ipv4.ip_forward=1 +~~~ + +Prise en compte de la configuration : +~~~ +sysctl -p +~~~ + +~~~ +echo 1 > /proc/sys/net/ipv4/ip_forward +~~~ + +## Création d'un VE + +Il faut avant tous posséder un template du système à installer. On peut les trouver [ici](http://download.openvz.org/contrib/template/precreated/). Un template se présente sous la forme d'une archive contenant le système de fichier du système à installer. Elle doit être placée (non décompressée) dans _/var/lib/vz/template/cache/_. + +Ensuite on peut créer un nouveau VE en utilisant ce template : +~~~ +vzctl create 1 --ostemplate debian-5.0-amd64-minimal --hostname --ipadd x.x.x.x --hostname foo +~~~ +_1_ représente l'id du VE. l'id 0 est réservé au système hôte. l'ostemplate doit correspondre au nom du template sans l'extension. ipadd permet de spécifier l'adresse IP du VE. + +On peut également définir une configuration à l'aide de `vzctl set`, par exemple : +~~~ +vzctl set 1 --nameserver x.x.x.x +~~~ + +## Gestion des VE + +Démarrer, arréter un VE : +~~~ +vzctl (start|stop|restart) VEID +~~~ + +Se connecter à un VE : +~~~ +vzctl enter VEID +~~~ + +Exécuter une commande sur un VE (depuis l'hôte) : +~~~ +vzctl exec VEID COMMAND +~~~ + +Lister les VE actifs : +~~~ +# vzlist + VEID NPROC STATUS IP_ADDR HOSTNAME + 1 6 running x.x.x.x foo +~~~ + +Lister les VE actifs *et* éteints : + +~~~ +# vzlist --all +~~~ + +Modifier le hostname : +~~~ +# vzctl set VMID --hostname foo.evolix.net --save +~~~ + +Modifier l'IP : +~~~ +# vzctl set VMID --ipdel 1.2.3.4 --save +# vzctl set VMID --ipadd 4.3.2.1 --save +~~~ + +Ajouter de la RAM : +~~~ +vzctl set VMID --ram 3072M --save +~~~ + +## Migration de VE à chaud + +Il est possible de migrer un VE d'une machine physique à une autre en utilisant la commande `vzmigrate`. +Avant tout, il faut s'assurer d'avoir le _PermitRootLogin yes_ et une clé SSH autorisée sur la machine cible. + +Ensuite, on peut démarrer la migration : +~~~ +vzmigrate -v --online TARGET_HOST VEID +~~~ + +L'option _online_ permet de minimiser le temps indisponibilité du VE (il est en pratique de quelques secondes). + +Cette méthode a plusieurs limitations, qui peuvent être gênantes dans certains cas : + +* Impossibilité de renommé l'ID du VE pendant la migration. Si un VE possède déjà le même ID sur la machine cible, la migration échouera ; +* Impossibilité de changer les paramètres réseau (IP, passerelle, DNS...). Si la machine cible se trouve dans un autre réseau, ou bien l'IP du VE est déjà prise, la migration échouera. + +Enfin, il faut s'assurer également que les limitations matérielles (quota mémoire, disque...) sont cohérentes avec l'environnement cible. + +## Créer et restaurer une snapshot d'un VE + +Un snapshot consister à freeze tous les processus et sauvegarder toutes les informations d'état, puis créer une image du VE. +L'image pourra ensuite être restaurer pour que tous les processus se retrouvent exactement dans le même état au moment du freeze. + +Freezer le VE : +~~~ +# vzctl chkpnt VEID --suspend +~~~ + +À partir de maintenant la machine devient indisponible. Il faut donc sauvegarder son état : + +~~~ +# vzctl chkpnt VEID --dump --dumpfile /path/foo +~~~ + +Enfin, on peut réveiller le VE : +~~~ +# vzctl chkpnt VEID --resume +~~~ + +Pour ce qui est de la réstauration, il faut avant tout stopper le VE si il est actif : +~~~ +# vzctl stop VEID +~~~ + +Ensuite, on peut restaurer le snapshot : +~~~ +# vzctl restore VEID --dumpfile /path/foo +~~~ + +Le VE est alors démarré en utilisant le snapshot et retrouve son ancien état. + +## Limiter les ressources utilisées par VE + +### Quotas disque + +~~~ +vzctl set VEID --diskspace SOFT_LIMIT:HARD_LIMIT --save +vzctl set VEID --diskinodes SOFT_LIMIT:HARD_LIMIT --save +~~~ + +De la même manière que pour les quotas Linux, on peut définir une limite soft et une limite hard. + +### Temps CPU + +On peut partager le temps CPU de 2 manière différenetes : + +* soit on limite un VE à un certain pourcentage d'utilisation du processeur : +~~~ +vzctl set VEID --cpulimit POURCENTAGE --save +~~~ + +* soit on indique une proportion d'utilisation du CPU en fonction des autres VE : +~~~ +vzctl set 1 --cpuunits 10 --save +vzctl set 2 --cpuunits 20 --save +~~~ +Dans cet exemple, si tous les VE ont besoins du CPU en même temps, OpenVZ accordera 2 fois plus de temps CPU au VE 2. L'avantage de cette méthode est que si le VE 2 n'utilise pas le CPU, le VE 1 peut prendre jusqu'à 100% du temps CPU. Ainsi, il n'y a pas de ressources inutilisées inutilement. +}}} + +### Les paramètres UBC + +Les UBC (Users BeanCounters) permettent de régler plus finement l'utilisation des ressources par VE. En général (ce n'est pas le cas de tous les paramètres), il faut définir une valeur barrière (limite soft) et une valeur limite (limite hard), dans le même esprit que les quotas Linux. + +La liste des UBC peut se trouver [ici](http://wiki.openvz.org/UBC_parameters_table) + +## OpenVZ via Proxmox + +sources.list : + +~~~ +deb wheezy pve-no-subscription +~~~ + +Installer : + +~~~ +# aptitude install pve-kernel-2.6.32-39-pve proxmox-ve-2.6.32 +~~~ + +Interface d'admin sur le port 8006 + + +Les configurations des VEs se retrouvent dans /etc/pve/nodes/VE0/openvz/VEID.conf + diff --git a/HowtoOpenfire.md b/HowtoOpenfire.md new file mode 100644 index 00000000..f6d4d5f5 --- /dev/null +++ b/HowtoOpenfire.md @@ -0,0 +1,19 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto openfire + +Installer Java : + +~~~ +# aptitude install default-jre-headless +~~~ + +Télécharger le paquet Debian sur + +~~~ +# dpkg -i openfire_3.9.1_all.deb +~~~ + +On peut ensuite y accéder sur le port 9090 : + +Attention, lors de la configuration, il faut bien mettre le FQDN sous peine d'avoir des erreurs java.lang.NullPointerException \ No newline at end of file diff --git a/HowtoOracleDB.md b/HowtoOracleDB.md new file mode 100644 index 00000000..0f08e77f --- /dev/null +++ b/HowtoOracleDB.md @@ -0,0 +1,210 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Oracle Database 11Gr2 + +## Télécharger Oracle DB + +Rendez-vous sur le site d'[Oracle](http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html). Vous devez avoir un compte, une fois connecté, récupérez l'adresse du lien qui contient un token, et vous pouvez le télécharger avec wget en copiant/collant l'URL, exemple de lien (plus valable évidemment) : + +## Installer les pré-requis + +Pour Wheezy, mettre dans son /etc/apt/sources.list : + +~~~ +deb [arch=amd64,i386] wheezy main +deb [arch=amd64,i386] wheezy/updates main +~~~ + +Puis : + + +~~~ +# dpkg --add-architecture i386 +# aptitude update +# aptitude install build-essential gcc-multilib ia32-libs libaio1 libstdc++5 rpm xauth x11-utils +~~~ + + +### Quelques hacks moches ... + +~~~ +# ln -s /usr/bin/awk /bin/awk +# ln -s /usr/bin/basename /bin/basename +# ln -s /usr/bin/rpm /bin/rpm +~~~ + +Sous Wheezy, il faudra « linker » quelques librairies utilisées lors de l'installation pour compiler des outils Oracle. + +~~~ +# mkdir /usr/lib64 +# chmod 755 /usr/lib64 +# ln -s /usr/lib/x86_64-linux-gnu/libpthread_nonshared.a /usr/lib64/ +# ln -s /usr/lib/x86_64-linux-gnu/libc_nonshared.a /usr/lib64/ +# ln -s /lib/x86_64-linux-gnu/libgcc_s.so.1 /usr/lib64/ +# ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/lib64/ +~~~ + +## Installation + +/!\ Attention il faut au moins 1Go de libre sur /tmp et 15Go de swap (peut-être ignoré) ainsi que 13Go pour la base oracle ! /opt devrait donc faire plus de 15Go ! + +Il faut installer un compte Unix "oracle" : + +~~~ +# adduser --system --home /opt/oracle --group oracle oracle +Ajout de l'utilisateur système « oracle » (UID 108) ... +Ajout du nouvel utilisateur « oracle » (UID 108) avec pour groupe d'appartenance « nogroup » ... +Création du répertoire personnel « /opt/oracle »... +# passwd oracle +~~~ + +L'installation d'Oracle DB se fait via un GUI, pour cela il faut activer le forwading X11 sur votre serveur SSH et autoriser le compte "oracle" à se connecter en SSH (par clé de préférence). +On peut ainsi se connecter en SSH ainsi (avec compression + algorithme de chiffrement léger histoire d'améliorer un peu la vitesse d'affichage des fenêtres) : + +~~~ +$ ssh -c arcfour,blowfish-cbc -YC oracle@server.example.com +~~~ + +Enfin on lance l'installeur : + +~~~ +# /opt/oracle/install/runInstaller +~~~ + +Dans la partie pré-requis cela va échouer pour pratiquement tout ... « fixez » ce qui est possible en cliquant sur Fix ! On vous demandera alors d'exécuter un script : + +~~~ +# bash /tmp/CVU_11.2.0.1.0_oracle/orarun.sh /tmp/CVU_11.2.0.1.0_oracle/fixup.response /tmp/CVU_11.2.0.1.0_oracle/fixup.enable /tmp/CVU_11.2.0.1.0_oracle +~~~ + +Cela va modifier sysctl avec les valeurs recommandés. + +En Wheezy il a y des erreurs lors de la compilation des outils. + +Si vous avez : + +~~~ +/usr/bin/ld: note: 'B_DestroyKeyObject' is defined in DSO /u01/app/oracle/product/11.2.0/dbhome_1/lib/libnnz11.so so try adding it to the linker command line +/u01/app/oracle/product/11.2.0/dbhome_1/lib/libnnz11.so: could not read symbols: Invalid operation +collect2: error: ld returned 1 exit status +~~~ + +Il faut lancer le make à la main, récupérer la dernière ligne qui s'affiche et la corriger en ajoutant `-lnmemso -lcore11 -lnnz11`. Enfin cliquer sur « retry install ». + +~~~ +cd $ORACLE_HOME/sysman/lib +make -f ins_emagent.mk "agent" +~~~ + +Avec Oracle 12 si vous avez : + +~~~ +/usr/bin/ld: /opt/oracle/app/oracle/product/12.1.0/dbhome_1//rdbms/lib/houzi.o: undefined reference to symbol 'ztcsh' +/usr/bin/ld: note: 'ztcsh' is defined in DSO /opt/oracle/app/oracle/product/12.1.0/dbhome_1//lib/libnnz12.so so try adding it to the linker command line +/opt/oracle/app/oracle/product/12.1.0/dbhome_1//lib/libnnz12.so: could not read symbols: Invalid operation +collect2: error: ld returned 1 exit status +~~~ + +Il faut éditer le fichier /opt/oracle/app/oracle/product/12.1.0/dbhome_1//lib/ldflags et ajouter -lons + +Si vous avez : + +~~~ +/usr/bin/ld: /opt/oracle/app/oracle/product/12.1.0/dbhome_1//rdbms/lib/houzi.o: undefined reference to symbol 'ztcsh' +/usr/bin/ld: note: 'ztcsh' is defined in DSO /opt/oracle/app/oracle/product/12.1.0/dbhome_1//lib/libnnz12.so so try adding it to the linker command line +/opt/oracle/app/oracle/product/12.1.0/dbhome_1//lib/libnnz12.so: could not read symbols: Invalid operation +collect2: error: ld returned 1 exit status +~~~ + +Il faut éditer /opt/oracle/app/oracle/product/12.1.0/dbhome_1//lib/sysliblist et mettre -lnnz12 + +Puis relancer l'installation avec « Retry ». + +L'installation devrait se finir, mais il reste encore des scripts à exécuter en root ! + +~~~ +# bash /opt/oracle/app/oraInventory/orainstRoot.sh +# bash /opt/oracle/app/oracle/product/11.2.0/dbhome_1/root.sh +~~~ + +Et voilà ! + +Vous pouvez ensuite vous connectez en xxx ou avec la magnifique interface web du type : Pour se connecter en admin le login est SYS, le mot de passe est celui que vous avez renseigné pendant l'installation et il faut cliquer sur, « connect as SYSDBA ». + +Rajouter cette ligne dans le .profile de l'utilisateur oracle : +~~~ +ORACLE_HOME=/opt/oracle/app/oracle/product/11.2.0/dbhome_1 +ORACLE_HOME_LISTNER=$ORACLE_HOME +export ORACLE_HOME +export ORACLE_HOME_LISTNER +PATH=/usr/sbin:/opt/oracle/app/oracle/product/11.2.0/dbhome_1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R +6/bin; export PATH +export ORACLE_UNQNAME=oracle +export ORACLE_SID=oracle +~~~ + +## Gestion + +Lancement de ??? : +~~~ +sudo -u oracle lsnrctl start +~~~ + +Lancement du serveur d'application et de l'interface web : +~~~ +sudo -u oracle emctl start dbconsole +~~~ +Note : N'est plus dispo en Oracle 12. C'est EM Express à la placé, lancé par défaut sur le port 5500. + +Lancement du SGBD : +~~~ +sudo -u oracle dbstart +~~~ + +## Erreurs bizarre + +~~~ +sqlplus "/ as sysdba" + +SQL*Plus: Release 11.2.0.1.0 Production on Mon Oct 15 18:01:54 2012 + +Copyright (c) 1982, 2009, Oracle. All rights reserved. + +ERROR: +ORA-01031: insufficient privileges + +~~~ + +Assurez-vous d'avoir + +~~~ +#define SS_DBA_GRP "dba" +#define SS_OPER_GRP "dba +~~~ + +dans le fichier $ORACLE_HOME/rdbms/lib/config.c et « relinkez » le binnaire oracle. + +`$ORACLE_HOME/bin/relink all` + +### dbstart ne démarre pas la DB + +Essayez + +~~~ +sqlplus "/ as sysdba" +alter system register; +startup; +~~~ + +Vérifiez aussi que db_name soit bien mis dans $ORACLE_HOME/dbs/init.ora + +### Mot de passe perdu ? + + + + +## Sources + + + + \ No newline at end of file diff --git a/HowtoOutlook.md b/HowtoOutlook.md new file mode 100644 index 00000000..3fbd809c --- /dev/null +++ b/HowtoOutlook.md @@ -0,0 +1,9 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Outlook + +## Outlook 2013 + +Souci d'envoi d'emails ? + + § Root your mailbox diff --git a/HowtoOwncloud.md b/HowtoOwncloud.md new file mode 100644 index 00000000..eafffbf1 --- /dev/null +++ b/HowtoOwncloud.md @@ -0,0 +1,83 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Installation + +## Prérequis + +* PHP 5.4 + +* Apache 2.4 with mod_php +* PHP module ctype +* PHP module dom +* PHP module GD +* PHP module iconv +* PHP module JSON +* PHP module libxml (Linux package libxml2 must be >=2.7.0) +* PHP module mb multibyte +* PHP module posix +* PHP module SimpleXML +* PHP module XMLWriter +* PHP module zip +* PHP module zlib +* PHP module pdo_mysql (si mysql) +* PHP module ldap (si ldap) +* PHP module smbclient (si smb) +* PHP module ftp +* PHP module imap +* Désactiver mod_webdav (owncloud ayant son propre DAV) +* Apache mod_rewrite + + +### Recommendé + +* PHP module curl +* PHP module fileinfo +* PHP module bz2 +* PHP module intl +* PHP module mcrypt +* PHP module openssl +* PHP module exif +* PHP module gmp (sftp storage) +* PHP module memcached (si memcached) +* Apache mod_headers +* Apache mod_env +* Apache mod_dir +* Apache mod_mime +* Désactiver (toute) l'authentification basic + + + +~~~ +# apt install libphp5-embed php5-curl php5-intl php5-mcrypt php5-gmp php5-memcache php5-memcached php5-gd php5-json php5-imap php5-pclzip +# a2enmod php5 rewrite headers env dir mime +# a2dismod dav +~~~ + +libphp5-embed: +'' +The following extensions are built in: bcmath bz2 calendar Core ctype date dba dom ereg exif fileinfo filter ftp gettext hash iconv libxml mbstring mhash openssl pcntl pcre Phar posix Reflection session shmop SimpleXML soap sockets SPL standard sysvmsg sysvsem sysvshm tokenizer wddx xml xmlreader xmlwriter zip zlib. +'' + +## Procédure + +* Se connecter en tant que utilisateur créé avec script evolinux de création compte +* Télécharger archive ou dépôt +* Appliquer un patch pour le .htaccess dans le répertoire principal car sinon erreur 503 pour directives non autorisés +* Créer un répertoire data (0770) +* Lancer la commande `occ` se trouvant dans le repertoire principal +~~~ +php occ maintenance:install --no-interaction --database '{{ db }}' --database-name '{{ db_name }}' --database-host '{{ db_host }}' \ +--database-user '{{ db_user }}' --database-pass "{{ db_pwd }}" --admin-user 'admin' --admin-pass '{{ admin_pwd }}' --data-dir '{{ dir_www }}/data' +~~~ + +* Si déjà installé, on peut éventuellement penser à une mise à jour ou upgrade : +~~~ +php occ upgrade --skip-migration-test +~~~ + +* Dans `config/config.php`, on remplace la valeur du champs *trusted_domains* par le FQDN souhaité (et non localhost - sinon ne marchera pas de l'extérieur) +* Dans `config/config.php`, on remplace aussi de la même manière la valeur du champs *overwrite.cli.url* +* Dans `config/config.php`, on ajoute un champs *instanceid*, avec comme valeur une chaîne de caractères aléatoire +* On ajoute les droits d'écriture pour le fichier `config/config.php` +* On ajoute les droits d'écriture pour les répertoires (et en recursif) pour : `data`, `config`, `apps`, `lib/private` + +Voilà c'est prêt! \ No newline at end of file diff --git a/HowtoPDFTK.md b/HowtoPDFTK.md new file mode 100644 index 00000000..60db23ac --- /dev/null +++ b/HowtoPDFTK.md @@ -0,0 +1,16 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto pdftk + + +Faire un PDF à partir de plusieurs PDF : + +~~~ +$ pdftk 1.pdf 2.pdf 3.pdf 4.pdf 5.pdf cat output out.pdf +~~~ + +Découper un PDF (sélectionner que certaines pages) : + +~~~ +$ pdftk ori.pdf cat 2-5 10-end output out.pdf +~~~ diff --git a/HowtoPFSTAT.md b/HowtoPFSTAT.md new file mode 100644 index 00000000..1d0f7982 --- /dev/null +++ b/HowtoPFSTAT.md @@ -0,0 +1,68 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto PFSTAT + +## Installation + +~~~ +# env ... +# pkg_add pfstat +~~~ + +## Configuration + +Exemple de pfstat.conf pour afficher la bande passante utilisée: + +~~~ +collect 1 = interface "bnx0" pass bytes in ipv4 diff +collect 2 = interface "bnx0" pass bytes out ipv4 diff + +image "/var/www/htdocs/pfstats/bnx0.jpg" { + from 1 days to now + width 980 height 300 + left + graph 1 bps "in" "bits/s" color 0 192 0 filled, + graph 2 bps "out" "bits/s" color 0 0 255 +} + +image "/var/www/htdocs/pfstats/bnx0-week.jpg" { + from 1 weeks to now + width 980 height 300 + left + graph 1 bps "in" "bits/s" color 0 192 0 filled, + graph 2 bps "out" "bits/s" color 0 0 255 +} + +image "/var/www/htdocs/pfstats/bnx0-month.jpg" { + from 1 months to now + width 980 height 300 + left + graph 1 bps "in" "bits/s" color 0 192 0 filled, + graph 2 bps "out" "bits/s" color 0 0 255 +} +~~~ + +On lance ensuite les crons suivants : + +~~~ +# crontab -l + +* * * * * /usr/local/bin/pfstat -q # Met a jour la base RRD +*/5 * * * * /usr/local/bin/pfstat -p # Trace les graphs +~~~ + + +Une petite page HTML pour rendre la consultation plus facile : + +~~~ + +

PFStats

+

bnx0

+

Today :

+ +

Last week :

+ +

Last month :

+ + +~~~ \ No newline at end of file diff --git a/HowtoPXE.md b/HowtoPXE.md new file mode 100644 index 00000000..226e16dd --- /dev/null +++ b/HowtoPXE.md @@ -0,0 +1,59 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +Nous allons voir comment mettre en place rapidement un serveur de boot PXE pour installer un système via le réseau. + +Nous allons installer 3 serveurs : + +* un serveur DHCP, pour fournir les informations réseau à la machine ; +* un serveur TFTP, pour le transfert des fichiers nécessaires au boot ; +* et bien sûr, le serveur PXE en lui même. + +Packets nécessaires : +~~~ +aptitude install dhcp3-server pxe atftpd +~~~ + +## Configuration du réseau + +*Attention :* Pour éviter d'interférer avec le serveur DHCP de votre réseau, il est nécessaire de recréer un second réseau, à l'aide d'un switch par exemple, et isolé de votre premier réseau. + +### Attribution d'une IP à la carte réseau + +On fixe l'adresse IP du serveur PXE : +~~~ +ifconfig eth0 192.168.0.254 +~~~ + +### Configuration du serveur DHCP + +Premièrement, il faut renseigner les interfaces gérées dans le fichier _/etc/default/dhcp3-serveur_ +~~~ +INTERFACES="eth0" +~~~ + +Ensuite, nous décrivons la configuration réseau dans le fichier _/etc/dhcp3/dhcpd.conf_ +~~~ +subnet 192.168.0.0 netmask 255.255.255.0 +{ + range 192.168.0.1 192.168.0.100; + option routers 192.168.0.100; + option subnet-mask 255.255.255.0; + option broadcast-address 192.168.0.255; + filename "/debian-5.0-amd64/pxelinux.0"; +} +~~~ +L'option filename indique le chemin (à partir du chroot du serveur TFTP) du fichier image à booter. + +## Configuration du serveur TFTP + +Nous utilisons atftp comme serveur TFTP. Aucune configuration n'est nécessaire, il est fonctionnel dès l'installation. Par défaut il est lancé par inetd. Pour désactiver ce comportement, remplacez la ligne `USE_INETD=true` par `false`. + +Suivant si inetd est utilisé ou pas, il est possible de modifier les options de atftpd, soit dans le fichier _/etc/inetd.conf_ soit dans le fichier _/etc/default/atftp_. + +À l'installation, un répertoire /tftpboot est créé. Il contient les fichiers qui seront servit par atftpd. + +## Configuration de PXE + +La configuration se fait dans le fichier _/etc/pxe.conf_ + +TODO rdessort : à terminer suivant la conf de l'eeepc \ No newline at end of file diff --git a/HowtoParted.md b/HowtoParted.md new file mode 100644 index 00000000..0d4c3bca --- /dev/null +++ b/HowtoParted.md @@ -0,0 +1,94 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# How To Parted + +Pour les disques de plus de 1.8 To, il faut utiliser un partitionnement de type GPT. +fdisk/cfdisk ne supporte pas les partitionnements GPT, et il faut utiliser *parted*. + +## Créer une table de partition + +~~~ +# parted /dev/sdb + +(parted) p +Error: /dev/sdb: unrecognised disk label + +(parted) mklabel gpt + +(parted) p +Model: IFT DS S12E-G2140-4 (scsi) +Disk /dev/sdb: 7998GB +Sector size (logical/physical): 512B/512B +Partition Table: gpt +~~~ + +## Créer une partition de boot pour système UEFI + +~~~ +# parted /dev/sdx + +(parted) mkpart ESP fat32 1MiB 513MiB +~~~ + +## Créer une partition avec parted + +~~~ +# parted /dev/sdb + +(parted) mkpart primary ext4 0% 100% +(parted) p +Number Start End Size File system Name Flags + 1 1049kB 2000GB 2000GB ntfs primary +(parted) align-check optimal 1 +1 aligned + +(parted) q + +# mkfs.ext4 /dev/sdb1 +~~~ + +~~~ +# parted /dev/loop0 + +(parted) mkpart primary ext2 0% 95% +(parted) mkpart primary linux-swap 95% 96% +(parted) mkpart primary linux-swap 96% 97% +(parted) p +Model: (file) +Disk /dev/loop0: 85.9GB +Sector size (logical/physical): 512B/512B +Partition Table: msdos + +Number Start End Size Type File system Flags + 1 1049kB 81.6GB 81.6GB primary ext4 boot + 2 81.6GB 82.5GB 859MB primary + 3 82.5GB 83.3GB 859MB primary + +(parted) q +~~~ + +## Resizer une partition avec parted (à froid) + +Le _resize_ de parted ne supporte pas ext4. +On utilisera plutôt cfdisk/fdisk/sfdisk pour supprimer/recréer la partition (attention bien conserver le même secteur de début !!!) + +## Flag boot + +~~~ +(parted) set 1 boot on +~~~ + +## Créer des volumes RAID + +Après avoir créé la partition qui va accueillir le RAID, comme une partition conventionnelle, il suffit d'activer le flag RAID sur cette dernière. +Par exemple, pour la première partition d'un disque : + +~~~ +(parted) set 1 raid on +~~~ + +Puis initialiser le RAID avec MDADM comme d'habitude : + +~~~ +mdadm --create /dev/mdX --chunk=64 --level=raid1 --raid-devices=2 /dev/sdX1 /dev/sdY1 +~~~ \ No newline at end of file diff --git a/HowtoPgBouncer.md b/HowtoPgBouncer.md new file mode 100644 index 00000000..04542c92 --- /dev/null +++ b/HowtoPgBouncer.md @@ -0,0 +1,94 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## PgBouncer + + + +PgBouncer agit en tant que proxy entre des clients et un ou des serveurs PostgreSQL. Il permet de gérer un pool de connexion et est donc utile lorsque le client ne gère pas soit même son pool, notamment dans le cas de PHP. + +Pour PostgreSQL, accepter une nouvelle connexion est très coûteux en terme de ressource car il va forquer un nouveau processus. PgPouncer permet donc de maintenir un pool de connexions actives auprès de PostgreSQL et de les rendre disponibles pour les clients voulant se connecter. PgBouncer a été conçu pour être très peu consommateur de ressources et pouvoir accepter un grand nombre de connexions (pas de fork ni de thread à chaque connexion, programmation évènementielle comme Nginx). + +### Installation + +~~~ +# aptitude install pgbouncer +~~~ + +### Configuration + +La configuration se fait dans le fichier _/etc/pgbouncer/pgbouncer.ini_. + +* La section _[databases]_ doit contenir la liste des bases de données sur + lesquelles les clients pourront se connecter, avec une chaine de connexion + valide. + + Par exemple : +~~~ +[databases] +remotedb = dbname=db host=192.0.2.42 port=5433 + +* = +~~~ + + Les connexions sur la base _remotedb_ seront renvoyées à l'hôte + 192.0.2.42 sur le port 5433 et sur la base _db_. Toutes les autres seront + renvoyées en local sur la base initialement demandée dans la requête. +* La section _[pgbouncer]_ contient différents paramètres pour le fonctionnement de PgBouncer. Les paramètres importants à modifier sont : +* _pool_mode_ : permet de définir quand une connexion peut être + réattribuée (_session_ dans le cas d'une déconnexion explicite du + client (peu de gain de performance mais permet d'être complètement + transparent pour le client), _transaction_ lorsqu'une transaction est + terminée, _statement_ lorsque une requête est terminée (les + transactions ne peuvent alors plus être utilisées)) ; +* _max_client_conn_ : le nombre total de client qui peuvent être connectés simultanément à PgBouncer. Exemple : 5000 +* _default_pool_size_ : le nombre total de client qui peuvent être connectés simultanément au serveur PostgreSQL derrière. Il ne faut pas dépasser le _max_connections_ du serveur en question moins une vingtaine (pour les connexions réservées au superadmin). Si _default_pool_size_ est dépassé (mais pas _max_client_conn_), alors les nouvelles connexions seront mises en attente. + +userlist.txt + +### Monitoring et administration + +#### Connexion à la console pgbouncer + +Une des fonctionnalités très intéressante de PgBouncer est de pouvoir s'y connecter avec le client `psql` est d'exécuter des pseudos requêtes SQL : + +~~~ +# psql -p 6432 -U pgbpostgres pgbouncer +psql (9.2.4, server 1.5.4/bouncer) +WARNING: psql version 9.2, server version 1.5. + Some psql features might not work. +Type "help" for help. + +pgbouncer=# +~~~ + +La requêtes `SHOW HELP;` permet de lister les requêtes possibles. + +#### Voir les statistiques, connexions établies, etc… + +~~~ +pgbouncer# show pools; +~~~ + +~~~ +pgbouncer# show clients; +~~~ + +~~~ +pgbouncer# show servers; +~~~ + +~~~ +pgbouncer# show stats; +~~~ + +#### Opérations d'administration + +À tester et documenter + +### FAQ + +* *Je vois un pic de connexions qui sont mises en attentant (_client_waiting_), alors que le _default_pool_size_ est loin d'être dépassé, pourquoi ?* + + C'est dû au fonctionnement de PgBouncer : si il reçoit un pic de demande de + connexion, afin de ne pas répercuter ce pic sur le backend PostgreSQL, il va + ouvrir ses connexions les une après les autres. \ No newline at end of file diff --git a/HowtoPhilesight.md b/HowtoPhilesight.md new file mode 100644 index 00000000..a71d8bc7 --- /dev/null +++ b/HowtoPhilesight.md @@ -0,0 +1,29 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +Philesight est déprécié au profit de Duc, du même auteur. [] + +# HowtoPhilesight + +Philesight permet de faire un graphique à la « filelight » mais côté serveur. Il s'agit d'un script cgi en ruby. On peut le configurer de sorte à ce que chaque nuit l'index soit mis à jour ainsi que les graphiques, et le consulter à tout moment.[[BR]] + +[[Image(philesight.png)]][[BR]] + +Une démo est disponible [ici](http://goo.gl/NLfpL) + +# Installation + +Télécharger l'archive sur le site de [Zevv](https://zevv.nl/play/code/philesight/). + +Installer les dépendances : + +~~~ +# aptitude install ruby libcairo-ruby libdb-ruby1.8 +~~~ + +Configurer votre serveur web de façon à gérer les cgi. On supposera que les cgi sont à placer dans /usr/lib/cgi-bin, copier les fichiers philesight* dans le répertoire cgi-bin. +Exécutez la commande `/usr/lib/cgi-bin/philesight --db /tmp/ps.db --index / --skip /proc/`. + +Si vous souhaitez modifier le chemin du fichier d'index, modifier le chemin dans philesight.cgi. + +À partir de maintenant vous pouvez accéder au graphique via l'url de votre cgi, du genre +L'idéal et de lancer la commande pour générer l'index chaque nuit avec un cron par exemple. \ No newline at end of file diff --git a/HowtoPortKnocking.md b/HowtoPortKnocking.md new file mode 100644 index 00000000..6f7cde13 --- /dev/null +++ b/HowtoPortKnocking.md @@ -0,0 +1,127 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto PortKnocking + +## Explication + +Le Port Knocking, littéralement « taper à la porte », permet d'ouvrir un port seulement si on a été identifier en se connectant auparavant sur un ou plusieurs ports. + +## Exemple de script + +~~~ +#!/bin/bash +export IF_RESEAU="eth4" + +start_fw() +{ + #Autoriser seulement tout en sortie. + /sbin/iptables -P INPUT DROP + /sbin/iptables -P FORWARD DROP + /sbin/iptables -P OUTPUT ACCEPT + #Autoriser Boucle local. + /sbin/iptables -A INPUT -i lo -j ACCEPT + /sbin/iptables -A OUTPUT -o lo -j ACCEPT + #Autoriser en entrée seulement si la connexion précédente à déjà été établie + /sbin/iptables -A INPUT -i $IF_RESEAU --match state --state ESTABLISHED,RELATED -j ACCEPT + #Autoriser l'ICMP + /sbin/iptables -A INPUT -p icmp -j ACCEPT + + #Port Knocking pour ouvrir le port SSH + /sbin/iptables -A INPUT -m recent --rcheck --seconds 5 --name SSH -m state --state NEW -p tcp --dport ssh -j ACCEPT + /sbin/iptables -A INPUT -i $IF_RESEAU -m state --state NEW -m tcp -p tcp --dport 1600 -m recent --name SSH --set -j DROP + + # Chargement du module de gestion des connexion state (autorisation des connexions deja etablies a passer le firewall) + /sbin/modprobe ip_conntrack +} +stop_fw() +{ + + # Vidage des règles pour toutes les tables : + iptables -F + iptables -X + + # On remet la politique par défaut à ACCEPT dans les trois tables par défaut + iptables -P INPUT ACCEPT + iptables -P OUTPUT ACCEPT + iptables -P FORWARD ACCEPT + +} + +case "$1" in + start) + start_fw + echo "firewall started" + ;; + + stop) + stop_fw + echo "firewall stopped" + ;; + + restart) + stop_fw + echo "firewall stopped" + start_fw + echo "firewall restarted" + ;; +*) + echo "usage: $0 [start|stop|restart]" >&2 + exit 1 + +esac +exit 0 + +~~~ + +Il faut retenir ces deux lignes, qui permettent d'activer le port knocking. On doit « taper » sur le port 1600, pour autoriser une connexion SSH, dans les 5 secondes qui suivent. + +~~~ +/sbin/iptables -A INPUT -m recent --rcheck --seconds 5 --name SSH -m state --state NEW -p tcp --dport ssh -j ACCEPT +/sbin/iptables -A INPUT -i $IF_RESEAU -m state --state NEW -m tcp -p tcp --dport 1600 -m recent --name SSH --set -j DROP +~~~ + + +Ensuite pour pouvoir se connecter, il faut « taper » au port 1600, puis dans les 5 secondes se connecter en SSH. On utilise pour cela _netcat_ : + +~~~ +$ nc -w 1 host 1600 < /dev/null > /dev/null 2>&1 +$ ssh host +~~~ + +## Automatisation + +L'idéal est de mettre en place un alias par exemple : + +~~~ +alias sshHostParticulier="nc -w 1 192.168.0.1 1600 < /dev/null > /dev/null 2>&1; ssh root@192.168.0.1" +~~~ + +## Utilisation de knockd + +knockd est un démon qui permet d'écouter sur une liste de ports donnés pour une séquence de « knocks » et d'exécuter une commande si la séquence reçue correspond à celle configurée. + +Voir + +### Installation + +knockd est présent dans les paquets Debian : +~~~ +# aptitude install knockd +~~~ + +### Configuration + +Exemple de configuration pour ouvrir le port SSH : +~~~ +[opencloseSSH] + sequence = 2222:tcp,3333:tcp,4444:tcp + seq_timeout = 15 + tcpflags = syn + start_command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT + cmd_timeout = 86400 + stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT +~~~ + +Dans l'exemple ci-dessus, il est nécessaire d'envoyer un paquet TCP avec le flag SYN successivement sur les ports TCP/2222, TCP/3333, TCP/4444 dans un délai de 15 secondes maximum pour que la commande spécifiée dans la directive `start_command` soit exécutée. + +Ici on autorise l'adresse IP qui a initiée la séquence à se connecter sur le port 22. Cette autorisation est valable 1 jour (`cmd_timeout`), au delà, l'accès est à nouveau fermé. Les directives `cmd_timeout` et `stop_command` sont optionnelles. \ No newline at end of file diff --git a/HowtoPostgreSQLReplication.md b/HowtoPostgreSQLReplication.md new file mode 100644 index 00000000..381ac17d --- /dev/null +++ b/HowtoPostgreSQLReplication.md @@ -0,0 +1,520 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Réplication PostgreSQL avec Slony + +Documentations de référence : + +* +* /usr/share/doc/slony1-2-bin/README.Debian.gz + +### Limitations + + + +* pas de réplication des champs BLOB +* pas de réplication des modifications de schéma + +### Prérequis + +* Avoir une clé primaire sur chaque table à répliquer (peut être contourné dans certaines conditions, mais fortement déconseillé par les dév. de Slony) +* Ne pas utiliser la commande SQL "TRUNCATE" (avant PG 8.4) + +### Introduction et principe + +Slony (_éléphants_ en russe, en rapport avec le logo de PostgreSQL entre autre) permet de faire de la réplication en mode master-slave. La réplication fonctionne à l'aide de triggers ajoutés au niveau des tables à répliquer. La réplication peut donc se paramétrer individuellement pour chaque table et est asynchrone (lors d'une modification sur le master, le changement est effectué dans un second temps sur le slave). Slony ne rejoue pas la requête entière sur le slave, il se contente de copier les nouvelles valeurs (intéressant dans le cas de requêtes imbriquées). + +### Installation + +~~~ +aptitude install postgresql-8.4 postgresql-8.4-slony1-2 slony1-2-bin +~~~ + +### Préparation PostgreSQL + +Soit deux machines, test1 et test2. + +* Configurer PostgreSQL pour écouter en réseau (_listen_addresses = '*' _) et autoriser les connexions de l'autre machine (fichier _pg_hba.conf_) : +~~~ +host dbrepl slony 192.0.2.1/32 md5 +~~~ + +* Sur chaque machine, avec le compte postgres : +~~~ +# compte propriétaire de la base de test qui sera répliquée +createuser -D -R -A dbrepl +# compte SUPERUSER +createuser -s slony -P +# base répliquée de test +createdb -O dbrepl dbrepl +# installation du langage PLPGSQL dans la base de test, nécessaire pour Slony -> nécessaire ? +#createlang plpgsql dbrepl +# Création d'une table de test (avec une primary key !) +echo "create table table1 (id serial primary key, t int);" | psql dbrepl +~~~ + +### Configuration de Slony + +Slonik (_petit éléphant_ en russe) est un langage de script permettant de contrôler Slony (les éléphants donc). Il peut soit être édité manuellement, soit être généré à l'aide de scripts Perl fournit avec le paquet Debian. + +#### Première méthode : édition manuelle des scripts Slonik + +* Sur test1 : +~~~ +# On charge le script slonik qui va servir à préparer le namespace slony dans les bases dbrepl de chaque machine +slonik </etc/slony1/slon_tools.conf +~~~ +~~~ +# $Id: slon_tools.conf-sample,v 1.8.2.4 2009-08-17 22:21:38 devrim Exp $ +# Author: Christopher Browne +# Copyright 2004-2009 Afilias Canada +# Revised extensively by Steve Simms + +# Keeping the following three lines for backwards compatibility in +# case this gets incorporated into a 1.0.6 release. +# +# TODO: The scripts should check for an environment variable +# containing the location of a configuration file. That would +# simplify this configuration file and allow Slony-I tools to still work +# in situations where it doesn't exist. +# +if ($ENV{"SLONYNODES"}) { + require $ENV{"SLONYNODES"}; +} else { + + # The name of the replication cluster. This will be used to + # create a schema named _$CLUSTER_NAME in the database which will + # contain Slony-related data. + $CLUSTER_NAME = 'slony_namespace'; + + # The directory where Slony should record log messages. This + # directory will need to be writable by the user that invokes + # Slony. + $LOGDIR = '/var/log/slony1'; + + # SYNC check interval (slon -s option) + # $SYNC_CHECK_INTERVAL = 1000; + + # Which node is the default master for all sets? + $MASTERNODE = 1; + + # Which debugging level to use? [0-4] + $DEBUGLEVEL = 2; + + # Include add_node lines for each node in the cluster. Be sure to + # use host names that will resolve properly on all nodes + # (i.e. only use 'localhost' if all nodes are on the same host). + # Also, note that the user must be a superuser account. + + add_node(node => 1, + host => 'test1', + dbname => 'dbrepl', + port => 5432, + user => 'slony', + password => 'slonypass'); + + add_node(node => 2, + host => 'test2', + dbname => 'dbrepl', + port => 5432, + user => 'slony', + password => 'slonypass'); +} + +# The $SLONY_SETS variable contains information about all of the sets +# in your cluster. +$SLONY_SETS = { + + # A unique name for the set + "set1" => { + + # The set_id, also unique + "set_id" => 1, + + "table_id" => 1, + "sequence_id" => 1, + + # This array contains a list of tables that already have + # primary keys. + "pkeyedtables" => [ + 'table1', + ], + + }, +}; + +# Keeping the following three lines for backwards compatibility in +# case this gets incorporated into a 1.0.6 release. +# +# TODO: The scripts should check for an environment variable +# containing the location of a configuration file. That would +# simplify this configuration file and allow Slony tools to still work +# in situations where it doesn't exist. +# +if ($ENV{"SLONYSET"}) { + require $ENV{"SLONYSET"}; +} + +# Please do not add or change anything below this point. +1; + +~~~ + + Explications : ce fichier de conf permet de décrire la réplication (le cluster et ses machines (nodes), les ensembles de tables (sets) à répliquer, etc…). Les paramètres importants sont : +* _$MASTERNODE_ : la machine qui sera le master par défaut lors du démarrage de Slony (on peut ensuite changer facilement le « sens » de réplication) ; +* _add_node()_ : cette fonction permet d'ajouter une base de données dans le cluster, en indiquant ses paramètres de connexion classique ; +* _$SLONY_SETS_ : ce tableau contient une liste de sets décrivant les tables à répliquer. Pour chaque set, on peut redéfinir quel node est le master avec la clé _origin_. Autrement, c'est $MASTERNODE qui est utilisé. La clé _pkeyedtables_ contient la liste des tables à répliquer. +* On peut maintenant faire appel aux scripts Perl pour mettre en place la réplication. Les scripts Perl ne font que générer le code slonik, il est nécessaire de les piper dans ~~~slonik}} (l'interpréteur) pour qu'il l'exécute. Sur une des deux machines : +~~~ +# Initialise le cluster Slony +slonik_init_cluster | slonik +# Initialise le set de réplication (ensemble de tables à répliquer), notamment installation des triggers. +slonik_create_set set1 | slonik +~~~ + +* Démarrage du démon slon sur les 2 machines : on crée le fichier de conf pour le démon slon et on ajuste le paramètre _SLON_TOOLS_START_NODES_ + +~~~ +# zcat /usr/share/doc/slony1-2-bin/examples/slon.conf-sample.gz >/etc/slony1/slon.conf +# /etc/init.d/slony1 start +~~~ + +* Enfin, abonner la machine test2 aux modifications faite sur le set1 : +~~~ +$ slonik_subscribe_set set1 node2 | slonik +~~~ + +### Administration + +#### Passer un node de slave à master + +~~~ +slonik_move_set | slonik +~~~ + +Note : ça ne marche pas terrible pour l'instant, si lors d'une écriture sur une table répliquée cette erreur apparait : +~~~ +ERREUR: Slony-I: Table table1 is currently locked against updates because of MOVE_SET operation in progress +~~~ +Il faut délocker manuellement le set : +~~~ +(slonik_print_preamble; echo "unlock set(ID=, ORIGIN=);") |slonik +~~~ + +#### Autoriser les écritures sur le slave + +Dans le cas où le master est down, et donc que le `slonik_move_set` ne marche pas (il a besoin de se connecter au futur slave pour le passer en slave) : +~~~ +slonik_failover | slonik +~~~ + +#### Modifier de la structure d'une table répliquée + +Slony ne répliquant que les données, en cas de modification de la structure d'une table sur un node, il faut la répercuter manuellement sur tous les autres. Un script Perl existe pour le faire sur tout les nodes à la fois : +~~~ +slonik_execute_script script.sql |slonik +~~~ + +#### Ajouter une nouvelle table + +* Dans le cas où elles ne sont présentes uniquement sur le master : +~~~ +postgres@master$ pg_dump --schema-only -t table1 -t table2 [...] base >new-tables.sql +postgres@slave$ psql base { + "set_id" => 2, + "table_id" => 296, + "sequence_id" => 1, + "pkeyedtables" => [ + 'table1', + 'table2', + [...] + ], + }, +~~~ +_table_id_ et _sequence_id_ indiquent à partir de quel ID Slony peut commencer à numéroter les nouvelles tables/sequences à ajouter. Ils doivents être uniques dans tout le cluster. Pour les déterminer : +~~~ +SELECT tab_id FROM _replication.sl_table ORDER BY tab_id DESC LIMIT 1; -- +1 +select seq_id from _replication.sl_sequence order by seq_id desc limit 1; -- +1 +~~~ +puis : +~~~ +slonik_create_set | slonik +~~~ + +* Abonner le nouveau set au slave : +~~~ +slonik_subscribe_set |slonik +~~~ + +* Un fois que la synchro est terminée (TODO), on peut merger le nouveau set avec l'actuel : +~~~ +slonik_merge_sets |slonik +~~~ + +* Modifier la config Slony pour supprimer le nouveau set et mettre les tables ajoutées dans le set actuel. + +#### Pour désinstaller un node/set/toute la conf Slony + +* Désactiver un set. Cela va supprimer les trigger positionnés sur toutes les tables du set, sur tous les nodes. Le schéma __replication_ est laissé intact : +~~~ +$ slonik_drop_set set1 | slonik +~~~ + +* Désactiver un node. Cela va supprimer les triggers de tous les sets du node, et supprimer le schéma __replication_. La commande échoue si des nodes sont encore abonnés au node à supprimer : +~~~ +$ slonik_drop_node node2 | slonik +~~~ + +* Désinstaller Slony. Cela va supprimer entièrement tous les triggers et le schéma Slony sur tous les nodes : +~~~ +$ slonik_uninstall_nodes set1 node1 | slonik +~~~ + +#### purger les tables de réplication _sl_log_1_ et _sl_log_2_ + +La purge des tables de réplication est un peu floue. Si l'on a besoin de purger les lignes +inutiles des tables, on peut faire cela : + +Afficher l'état de la réplication : + +~~~ +=# select ev_origin,ev_seqno,"pg_catalog".txid_snapshot_xmin(ev_snapshot) from _replication.sl_event where + (ev_origin, ev_seqno) in (select ev_origin, min(ev_seqno) from _replication.sl_event where ev_type = 'SYNC' group by ev_origin); + ev_origin | ev_seqno | txid_snapshot_xmin +-----------+------------+-------------------- + 1 | 5000179913 | 13214118 + 2 | 5000000016 | 163352 +(2 lignes) +~~~ + +Puis purge en fonction des chiffres : + +~~~ +=# delete from _replication.sl_log_1 where log_origin=1 and log_txid < 5000179913; +DELETE 7020095 +=# delete from _replication.sl_log_2 where log_origin=1 and log_txid < 5000179913; +DELETE 7020095 +=# vacuum _replication.sl_log_1; +=# vacuum _replication.sl_log_2; +~~~ + +À faire sur tout les nodes indépendamment. + +#### purger complètement les tables de réplication _sl_log_1_ et _sl_log_2_ + +Cela ne doit être fait que dans des cas particuliers : + +~~~ +=# truncate _replication.sl_log_1; +=# truncate _replication.sl_log_2; +~~~ + +Voir + +#### En cas de duplicate keys lors de la réplication + +Note : théoriquement, cela devrait se produire très rarement. + +Dans les logs du slave, si un message de ce type aparrait : +~~~ +insert into "public"."nom_de_la_table" (...) values (...); +" ERROR: duplicate key value violates unique constraint "..." + - qualification was: where log_origin = 1 and ( ( + log_tableid in (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295) + and (log_txid < '12782788' and "pg_catalog".txid_visible_in_snapshot(log_txid, '12782168:12782788:12782168,12782782')) + and (log_txid >= '12782762' or log_txid IN (select * from "pg_catalog".txid_snapshot_xip('12782168:12782762:12782168'))) +) ) +~~~ + +~~Si on s'est assuré après vérification qu'il n'y a pas besoin de rejouer cette requête, on peut la supprimer manuellement des logs de réplication :~~ + +* ~~arrêter les démons slon~~ +* ~~rechercher l'ID de la table concernée par l'erreur de réplication : `select tab_id from _replication.sl_table where tab_relname='nom_de_la_table';`~~ +* ~~sur le master, rechercher la requête dans les logs : `select * from _replication.sl_log_{1,2} where log_tableid=id_table` + rajouter les conditions sur log_txid indiquées par les 2 dernières lignes des logs ci-dessus peut aider~~ +* ~~récupérer la valeur du champ log_actionseq, puis `delete from _replication.sl_log_{1,2} where log_actionseq=id_query;`~~ +* ~~relancer les démons slon~~ + +~~Une manière plus radicale de faire, notamment si il y a plusieurs erreurs sur une même table, peut être de désabonner le slave du master, vider la table sur le slave, et réabonner le slave.~~ + +On peut faire simplement un `TRUNCATE table` sur le slave à chaud, sans arrêter les démons slon. Cela va débloquer rapidement la réplication, ~~et les éventuelles lignes manquantes seront automatiquement recopiées depuis le master.~~ -> pas sûr, à tester ! + +#### En cas de transaction bloquée + +Message d'erreur dans les logs : +~~~ +transactions earlier than XID 12806955 are still in progress +data copy for set 1 failed 11 times - sleep 60 seconds +~~~ + +En gros Slony est bloqué à cause d'un ExclusiveLock sur la table en question. +Voir + +Rien de particulier à faire, si ce n'est d'attendre que la requête ayant posé ce verrou se termine. + +#### Ajouter une machine dans un cluster existant + +* Ajouter la chaine de connexion PostgreSQL dans les fichier _slon_tools.conf_ de toutes les machines membres du cluster ; +* ajouter les autorisations firewall/PostgreSQL nécessaire depuis/vers toutes les machines du cluster ; +* réinjecter la structure de la base de données à répliquer, à l'exception du schéma Slony ; +* sur la nouvelle machine, exécuter les commandes suivantes : +~~~ +# slonik_store_node node3 |slonik +# slonik_subscribe_set set1 node3 | slonik +~~~ + +La nouvelle machine se voit attribuer le numéro « node3 » et est abonnée au set1. + +#### set mal supprimé + +Si un set est toujours présent dans la table sl_set : +~~~ +=# select * from _replication.sl_set; + set_id | set_origin | set_locked | set_comment +--------+------------+------------+----------------------- + 1 | 4 | | Set 1 for replication + 2 | 4 | | Another set +~~~ + +Et que Slony ne le voit plus : +~~~ +# slonik_drop_set 2 +Non-existent set specified. +~~~ + +Il faut alors le supprimer à la main : +~~~ +=# delete from _replication.sl_set where set_id=2; +~~~ + +### Fonctionnement des tables sl_log_{1,2} + + 1. Opération d'écriture sur le nœud maître -> les données modifiées vont être insérées dans la table _sl_log_1_, grace au trigger __replication_logtrigger_ positionné sur la table ayant subie les modifications. + 2. Sur le nœud esclave, le démon _slon_ lit à intervalles réguliers la table de log active, ici _sl_log_1_. Il va alors récupérer les nouvelles entrées pour les copier dans sa propre table de log. À noter qu'avant de se connecter à la base PostgreSQL sur le nœud maître, il « pingue » le démon slon sur le master, et si il ne répond pas, ne fait rien. Par conséquent, si un des deux démon _slon_ ne tourne pas, la réplication ne se fait pas. + 3. Les nouvelles modifications sont alors rejouer sur le slave. + +Par défaut (option _cleanup_deletelogs=false_), les entrées dans les tables de logs ne sont pas supprimées, étant donné qu'un _DELETE_ à chaque fois peut être assez coûteux en terme de ressources pour la base de données. Un basculement de tables est alors opéré (par défaut toutes les 10 minutes, modifiable par l'option _cleanup_interval_), de _sl_log_1_ vers _sl_log_2_ ou inversement, ce qui permet de repartir sur une table vide. Un _TRUNCATE_ est alors exécuté sur l'ancienne table de log pour la nettoyer. Tous les 3 cycles de basculement, un _VACUUM_ est exécuté sur la table de log (définit par la variable _vac_frequency_). + +Pour connaître la table de log active : + +### Monitoring + +Des informations sur la réplication en temps réel sont disponibles dans les tables _sl_*_ du schéma __CLUSTERNAME_ (par défaut __slony_namespace_). Le détail de ces tables est disponible ici : + +Un script fournit avec Slony, _check_slony_cluster.sh_peut être utilisé comme check Nagios pour vérifier que la réplication est ok. Pour qu'il puisse être utilisé en tant que postgres sans demander de mot de passe, il est nécessaire de l'adapter un peu : +~~~ +--- /usr/share/doc/slony1-2-bin/examples/check_slony_cluster.sh.orig 2012-03-27 15:57:45.000000000 +0200 ++++ /usr/share/doc/slony1-2-bin/examples/check_slony_cluster.sh 2012-03-27 15:57:47.000000000 +0200 +@@ -11,7 +11,6 @@ + # script requires two parameters: + # CLUSTERNAME - name of slon cluster to be checked + # DBNAME - name of master database +-# DBHOST - host name of master database + # + # It also depends on PGPORT being set to the appropriate port + # +@@ -22,14 +21,13 @@ + # check parameters are valid + if [ $# -ne 3 ] + then +- echo "Invalid parameters need CLUSTERNAME DBNAME DBHOST" ++ echo "Invalid parameters need CLUSTERNAME DBNAME" + exit 2 + fi + + # assign parameters + CLUSTERNAME=$1 + DBNAME=$2 +-DBHOST=$3 + + # setup the query to check the replication status + SQL="select case +@@ -56,7 +54,7 @@ + ) as t2" + + # query the master database +-CHECK=`psql -c "$SQL" --tuples-only -U postgres -h $DBHOST $DBNAME` ++CHECK=`psql -c "$SQL" --tuples-only $DBNAME` + + if [ ! -n "$CHECK" ] + then +~~~ +~~~ +/usr/share/doc/slony1-2-bin/examples/check_slony_cluster.sh slony_namespace dbrepl2 localhost +~~~ \ No newline at end of file diff --git a/HowtoPostgreSQLStreamingReplication.md b/HowtoPostgreSQLStreamingReplication.md new file mode 100644 index 00000000..1da1bef9 --- /dev/null +++ b/HowtoPostgreSQLStreamingReplication.md @@ -0,0 +1,209 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + + +## _Streaming Replication_ avec PostgreSQL + +La réplication en flux (_Streaming Replication_) est disponible à partir de la version 9.0 de PostgreSQL. + +Néanmoins, tout ce qui suit se rapporte à la version 9.2 (dernière en date), qui apporte plusieurs améliorations sur la réplication. + +### Caractéristiques + +* Réplication de type asynchrone (le maître et l'esclave peuvent ne pas être synchro à un instant _t_) ou synchrone (une transaction est commitée uniquement si elle a pu être écrite sur le maître et envoyé à l'esclave) ; +* réplication basée sur les journaux binaires générés par PostgreSQL (WAL, pour _Write Ahead Log_) ; +* réplication de l'intégralité des données et structures (toutes les bases de données sont répliquées, avec leurs tables et leurs données, pas de granularité possible). Cette fonctionnalité commencera à être introduite à partir de la 9.3 ; +* le serveur jouant le rôle d'esclave ne peut être interrogé qu'en lecture ; +* possibilité de mettre en cascade plusieurs esclaves. + +Par rapport au mode de réplication _Hot Standby_, l'avantage avec la réplication en flux est qu'il n'est pas besoin d'attendre qu'un journal soit plein et fermé pour qu'il soit communiquer au serveur esclave. À l'inverse cela introduit une légère charge supplémentaire (au niveau CPU) puisqu'un (ou plusieurs) processus supplémentaire doit tourner sur le maître (wal_senders). + +### Pré-requis + +Pré-requis pour pouvoir mettre en place une infra avec 1 maître et 1 esclave : + +* même architecture (32 bits/64 bits) sur les 2 serveur ; +* même version majeure de PostgreSQL sur les 2 serveur (même version mineure est conseillé) ; + +### Installation de PostgreSQL 9.2 + +Sous Debian Wheezy, installation depuis le dépôt Debian de PostgreSQL : +~~~ +# echo "deb wheezy-pgdg main" >/etc/apt/sources.list.d/wheezy-pgdg.list +# echo "Package: postgresql-9.2 postgresql-client-common postgresql-common libpq5 +> Pin: release a=wheezy-pgdg +> Pin-Priority: 999" >/etc/apt/preferences.d/postgresql +# wget --quiet -O - |apt-key add - +# aptitude update +# aptitude install postgresql-9.2 postgresql-contrib-9.2 +~~~ + +Les paquets sont maintenus par les mêmes développeurs que sur Debian et Ubuntu, et les mises à jours de sécurité/corrections de bugs y sont faites régulièrement. La raison pour laquelle le dépôt est distinct du projet Debian est dû au fait qu'il a pour but de fournir plusieurs version de PostgreSQL pour une même version de Debian. + +### Configuration du serveur maître + +_Cette configuration est relative au serveur maître, mais elle doit également être reprise à l'identique sur le serveur esclave, dans le cas où les rôles doivent être échangés (suite à un failover/switchover)._ + +Décommenter ou ajouter les directives suivantes dans le fichier _/etc/postgresql/9.2/main/postgresql.conf_ : +~~~ +# Nécessaire pour que l'esclave puisse se connecter. +listen_addresses = '*' + +# Nombre maximum de processus walsender à lancer (mettre au moins le même +# nombre que de serveur esclave qui se connecteront dessus + 1 (reconnexions, +# maintenance...). +# (1 processus = 1 connexion) +max_wal_senders = 2 + +# « niveau de verbosité » des journaux PostgreSQL. Le niveau maximum est +# nécessaire (hot_standby) pour que l'esclave soit accessible en lecture. +wal_level = hot_standby + +# Activation de l'archivage des WAL. Nécessaire pour pouvoir remettre en +# place facilement la réplication suite à un failover/switchover. +archive_mode = on +archive_command = 'rsync %p 192.0.2.2:/srv/pg-archives/%f' +~~~ + +Créer un utilisateur dédié pour la réplication : +~~~ +postgres=# CREATE ROLE repl WITH LOGIN REPLICATION PASSWORD 'xxxxxxxx'; +~~~ + +Autoriser le serveur esclave à se connecter au maître : +~~~ +hostssl replication repl 192.0.2.2/32 md5 +~~~ + +### Configuration du serveur esclave + +_Cette configuration est relative au serveur esclave, mais elle doit également être reprise à l'identique sur le serveur maître, en renommant le fichier _recovery.conf_ pour qu'il ne soit pas pris en compte._ + +Décommenter ou ajouter les directives suivantes dans le fichier _/etc/postgresql/9.2/main/postgresql.conf_ : +~~~ +# Le serveur est en mode esclave en lecture seule +hot_standby = on +~~~ + +Créer un fichier _recovery.conf_ avec les info suivantes : +~~~ +# echo "standby_mode = 'on' +> primary_conninfo = 'host=192.0.2.1 user=repl password=xxxxxxxx application_name=foo' +> archive_cleanup_command = '/usr/lib/postgresql/9.2/bin/pg_archivecleanup /srv/pg-archives/ %r' +> recovery_target_timeline = 'latest'" >~postgres/9.2/main/recovery.conf +~~~ + +Il est nécessaire que ce fichier appartiennent à l'utilisateur _postgres_, notamment pour le [#Passerunserveuresclaveenmaître failover] : +~~~ +# chown postgres:postgres ~postgres/9.2/main/recovery.conf +~~~ + +### Synchronisation initiale des données + +* Arrêter PostgreSQL sur l'esclave ; +* sur le maître, indiquer à PostgreSQL qu'on commence une sauvegarde. Il va notamment faire un checkpoint dans son WAL courant et retourner sa position : +~~~ +postgres$ psql -c "SELECT pg_start_backup('synchro initiale')" +~~~ +* lancer le rsync du datadir vers l'esclave : +~~~ +# rsync -avz --delete --exclude /pg_xlog/* --exclude /postmaster.* --exclude /recovery.* ~postgres/9.2/main/ 192.0.2.2:~postgres/9.2/main/ +~~~ +* indiquer à PostgreSQL que le backup est terminé : +~~~ +postgres$ psql -c "SELECT pg_stop_backup()" +~~~ +* redémarrer PostgreSQL sur l'esclave. + +### Administration + +#### Monitoring + +Plusieurs possibilité pour surveiller la réplication : + +* Voir la position courante dans les logs sur le maître et l'esclave (on peut en déduire si ils sont synchro ou pas) : +~~~ +# pgrep -lf "wal (sender|receiver) process" +6891 postgres: wal receiver process streaming 0/C085240 +~~~ +* PostgreSQL fournit la vue `pg_stat_replication()` qui permet de lister les connexions aux processus walsender, avec différentes informations utiles : +~~~ +postgres=# SELECT * from pg_stat_replication; +-[ RECORD 1 ]----+------------------------------ +pid | 29745 +usesysid | 16387 +usename | repl +application_name | foo +client_addr | 192.0.2.2 +client_hostname | +client_port | 46581 +backend_start | 2013-04-30 10:39:43.230287-04 +state | streaming +sent_location | 0/C0873B8 +write_location | 0/C0873B8 +flush_location | 0/C0873B8 +replay_location | 0/C0873B8 +sync_priority | 0 +sync_state | async +~~~ + + Les données à surveiller sont notamment les _*_location_, qui indique la position courante dans les WAL à différentes étapes de la réplication. + Voir pour le détails des champs. +* Pour pouvoir quantifié le retard de réplication, on peut utiliser la commande [check_postgres](http://bucardo.org/check_postgres/check_postgres.pl.html) avec l'option _hot_standby_delay_ : +~~~ +$ check_postgres --action=hot_standby_delay --dbhost=localhost --dbport=5432 --dbname=template1 --dbuser=nrpe --dbpass=xxxxxx --dbhost=192.0.2.2 --dbport=5432 --warning=500000 --critical=1000000 +POSTGRES_HOT_STANDBY_DELAY OK: DB "template1" (host:192.0.2.2) 0 | time=0.09s replay_delay=12568;500000;1000000 receive-delay=8192;500000;1000000 +~~~ + Où localhost est le maître et 192.0.2.2 l'esclave. Les valeurs de _replay_delay_ et _receive-delay_ sont *à priori* exprimées en octets de WAL à rejouer. + +#### Passer un serveur esclave en maître + +Si le maître est toujours joignable, éteindre PostgreSQL en forçant la déconnexion des clients : +~~~ +# pg_ctlcluster 9.2 main stop -- -m fast +~~~ + +Sur l'esclave, faire en sorte que PostgreSQL accepte les connexions en écriture : +~~~ +# pg_ctlcluster 9.2 main promote +~~~ + +L'esclave va d'abord rattraper son éventuel retard dans le traitement des logs de réplication, puis une fois prêt se mettra à accepter les requêtes en écritures. + +Le fichier _recovery.conf_ est renommé en _recovery.done_ pour qu'il ne soit pas lu en cas de redémarrage de PostgreSQL. + +Messages de PostgreSQL lors du passage en maître : +~~~ +2013-04-23 05:54:15 EDT LOG: received promote request +2013-04-23 05:54:15 EDT LOG: redo done at 0/6000020 +2013-04-23 05:54:15 EDT LOG: last completed transaction was at log time 2013-04-23 05:54:10.217923-04 +2013-04-23 05:54:15 EDT LOG: selected new timeline ID: 2 +2013-04-23 05:54:15 EDT LOG: archive recovery complete +2013-04-23 05:54:15 EDT LOG: database system is ready to accept connections +2013-04-23 05:54:15 EDT LOG: autovacuum launcher started +~~~ + +*ATTENTION : à partir du moment où l'esclave cesse de lire les journaux du maître, toutes les écritures qui continuent de se faire sur le maître seront perdues. Il faut donc être certain que le maître soit réellement inaccessible avant de faire la bascule.* + +#### Rétablissement de la réplication après un failover + +État courant : le serveur esclave accepte les écritures suite à la procédure de failover, et le serveur maître contient des données obsolètes car pas mises à jour. + +Il faut alors mettre en place le _recovery.conf_ sur l'ancien master et démarrer PostgreSQL. Il va alors rejouer les WAL pour rattraper le retard accumulé, puis se mettre en mettre en mode _streaming replication_. + +#### Arrêter la réplication +*Arrêter/reprendre le "replay" des WAL sur l'esclave : +~~~ +postgres=# SELECT pg_xlog_replay_pause(); +postgres=# SELECT pg_xlog_replay_resume(); +~~~ +* Arrêter/reprendre le flux des WAL depuis le maître. Il ne semble pas y avoir de solution autre que de couper le flux au niveau réseau. Sur le maître : +~~~ +# iptables -I INPUT -s 192.0.2.2 -p tcp --dport 5432 -j REJECT +# iptables -D INPUT 1 +~~~ + +### Diverses notes/spécificités de la réplication + +* Si une requête sur le serveur esclave bloque la réplication (par exemple un `SELECT` qui bloque un `DROP TABLE`) pendant un temps trop long, la requête sur l'esclave sera tuée (ici le SELECT). Ce temps est définit par la directive `max_standby_streaming_delay` sur la configuration de l'esclave. + + Ce comportement peut-être désactivé grâce à la directive `hot_standby_feedback`, qui fait en sorte que l'esclave communique l'état des requêtes au maître, mais cela à un impact sur le maître. \ No newline at end of file diff --git a/HowtoPowerVault.md b/HowtoPowerVault.md new file mode 100644 index 00000000..a3e5ff42 --- /dev/null +++ b/HowtoPowerVault.md @@ -0,0 +1,2 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + diff --git a/HowtoPrestashop.md b/HowtoPrestashop.md new file mode 100644 index 00000000..6bc4d2c3 --- /dev/null +++ b/HowtoPrestashop.md @@ -0,0 +1,55 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Prestashop + +## Prérequis + +* PHP 5.2 ou plus. +* php.ini: +~~~ +allow_url_fopen on +register_globals off +magic_quotes_* off +safe_mode off +upload_max_filesize > "16M" ou plus. +~~~ +Extensions PHP utiles : PDO_MySQL, cURL, SimpleXML, mcrypt, GD, OpenSSL, DOM, SOAP. + +* MySQL 5.0 ou plus + +Les + : + +* Serveur web Apache 1.3 ou plus, ou serveur nginx. +* apache +~~~ +mod_rewrite, mod_security, mod_auth_basic +~~~ + +## Installation + +Télécharger la dernière version _stable_ de prestashop par archive ou par dépôt git. + +Selon la version, peut avoir un problème dans le fichier `config/autoload.php` : commenter la ligne qui gène si optionnel. + +* Utiliser la ligne de commande pour installer prestashop: +~~~ +php './install-dev/index_cli.php' --language=fr --timezone='localhost' --base_uri='/' --domain='{{ host }}' \ +--db_server='{{ db_host }}' --db_user='{{ db_user }}' --db_password='{{ db_pwd }}' --db_name='{{ db_name }}' \ +--db_clear=0 --db_create=0 --name='{{ site_title }}' --firstname='{{ firstname }}' --lastname='{{ lastname }}' \ +--password='{{ admin_pwd }}' --email='{{ admin_email }}' --newsletter=0 +~~~ + +* supprimer le repertoire `install-dev` +* S'assurer des droits pour le groupe afin que l'instance du serveur web lancé en tant que www- puisse écrire dans les répertoires. +~~~ +$ chmod -R g+w config/ cache/ log/ img/ mails/ modules/ themes/ translations/ upload/ download/ +~~~ + +* Après installation : +~~~ +$ mv admin/ admin$RANDOM/ +~~~ + + + + diff --git a/HowtoProFTPD.md b/HowtoProFTPD.md new file mode 100644 index 00000000..585d7567 --- /dev/null +++ b/HowtoProFTPD.md @@ -0,0 +1,173 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto ProFTPD + + + +## Installation + +~~~ +# aptitude install proftpd +~~~ + +## Configuration + +Le fichier de configuration principal est _/etc/proftpd/proftpd.conf_. +Voici les directives à changer : + +~~~ +UseIPv6 off +ServerName "XXX FTP Server" +PassivePorts 60000 61000 +MaxInstances 50 +MaxClients 40 +MaxClientsPerHost 20 +Umask 137 027 +UseReverseDNS off +IdentLookups off +DefaultRoot ~ +RequireValidShell off +UseFtpUsers off +ServerIdent on "FTP Server Ready" +AccessGrantMsg "Hey, bienvenue %u sur le serveur FTP XXX.evolix.net !" +# Allow RESUME (REST command) +AllowStoreRestart on + + + AllowUser foo + AllowGroup ftpusers + DenyAll + + +~~~ + +Les utilisateurs pouvant utilisant le FTP doivent être dans le groupe _ftpusers_ (à créer !). + +## Création de comptes virtuels + +À ajouter dans _/etc/proftpd/proftpd.conf_ : +~~~ +AuthOrder mod_auth_file.c +AuthUserFile /etc/proftpd/vpasswd +~~~ + +La commande complète : + +~~~ +# ftpasswd --file=/etc/proftpd/vpasswd --name=FTP_user --home=/home/example/FTP_user --shell=/bin/false --uid=1664 --gid=1664 --passwd +~~~ + +Préciser les UID et GID du compte UNIX propriétaire du répertoire dans lequel est le $HOME du compte virtuel créé. + +Pour modifier le mot de passe d'un compte existant : + +~~~ +# ftpasswd --file /etc/proftpd/vpasswd --name=FTP_user --change-password --passwd +~~~ + +### Divers + +Pour limiter les uploads de fichiers de taille supérieure à 50 Mo : + +~~~ +MaxStoreFileSize 50 Mb +~~~ + +### Changer droits defaut (umask) + +~~~ + + Umask 022 + +~~~ + +## Quota + +Pour activer les quotas spécifiquement à ProFTPD avec gestion via fichiers : + +~~~ +# cd /etc/proftpd +# ftpquota --create-table --type=limit +# ftpquota --create-table --type=tally +~~~ + +Puis ajouter dans la configuration : + +~~~ + +QuotaEngine on +QuotaLimitTable file:/etc/proftpd/ftpquota.limittab +QuotaTallyTable file:/etc/proftpd/ftpquota.tallytab + +~~~ + +On peut ensuite positionner des quotas, par exemple pour limiter les données uploadées à 200 Go : + +~~~ +# ftpquota --add-record --type=limit --bytes-upload=200 --units=Gb --name=foo --quota-type=user +~~~ + +Imaginons que vous positionnez le quota alors que l'utilisateur a déjà 170 Go, vous devez mettre à jour son compteur : + +~~~ +# ftpquota --update-record --type=tally --bytes-upload=170 --units=Gb --name=foo --quota-type=user +~~~ + +Vous pouvez lister les données de quota sur le serveur ainsi : + +~~~ +# ftpquota --show-records --type=tally +------------------------------------------- + Name: foo + Quota Type: User + Uploaded bytes: 182536110080.00 + Downloaded bytes: 0.00 + Transferred bytes: 0.00 + Uploaded files: 0 + Downloaded files: 0 + Transferred files: 0 + +# ftpquota --show-records --type=limit +------------------------------------------- + Name: foo + Quota Type: User + Per Session: False + Limit Type: Hard + Uploaded bytes: 214748364800.00 + Downloaded bytes: unlimited + Transferred bytes: unlimited + Uploaded files: unlimited + Downloaded files: unlimited + Transferred files: unlimited +~~~ + +Via FTP, vous pourrez voir les données de quota ainsi : + +~~~ +ftp> quote SITE QUOTA +200-Quota pour la session actuelle [courant / limite]: +200-Nom: foo +200-Type quota: Utilisateur +200-Par session : Faux +200-Type de limite : matérielle +200- bytes: 182536110080.00/193273528320.00 envoyés +200- bytes: unlimited reçus +200- bytes: unlimited téléchargés +200- files: unlimited envoyés +200- files: unlimited reçus +200- files: unlimited téléchargés +200 Veuillez contacter ftpmaster@example.com si ces données sont inexactes +~~~ + +Enfin, vous pouvez réinitialiser un compteur (tous les jours par exemple) : + +~~~ +# ftpquota --update-record --type=tally --name=foo --quota-type=user +~~~ + +Ou même effacer toutes les données de quota d'un utilisateur : + +~~~ +# ftpquota --delete-record --type=limit --name=foo --quota-type=user +# ftpquota --delete-record --type=tally --name=foo --quota-type=user +~~~ diff --git a/HowtoPulseAudio.md b/HowtoPulseAudio.md new file mode 100644 index 00000000..1e3ce80b --- /dev/null +++ b/HowtoPulseAudio.md @@ -0,0 +1,18 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Pulse Audio + +~~~ +$ pacmd +Welcome to PulseAudio! Use "help" for usage information. +>>> list-sources +>>> list-sinks + +>>> set-default-source alsa_input.usb-Logitech_Logitech_B530_USB_Headset-00-Headset.analog-mono +>>> set-default-sink alsa_output.usb-Logitech_Logitech_B530_USB_Headset-00-Headset.analog-stereo +~~~ + +~~~ +$ alsamixer --device pulse +$ pavucontrol +~~~ \ No newline at end of file diff --git a/HowtoPuppet.md b/HowtoPuppet.md new file mode 100644 index 00000000..adec4e33 --- /dev/null +++ b/HowtoPuppet.md @@ -0,0 +1,162 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Puppet + +## Mise en place de l'infra + +Puppet fonctionne avec un _puppetmaster_, qui centralise la configuration à déployer sur les différents nœuds, sur lesquels tournent des agents Puppet. + +[[Image(puppet_simple.png, 33%)]] + +### Puppet master + +#### Installation + +~~~ +# aptitude install puppetmaster +~~~ + +On peut d'ores-et-déjà lancer le démon : +~~~ +# /etc/init.d/puppetmaster start +~~~ + +### Agents Puppet + +#### Installation + +~~~ +# aptitude install puppet +~~~ + +#### Configuration + +Activer l'agent Puppet dans _/etc/default/puppet.conf_ : +~~~ +START=yes +~~~ + +Ajouter l'adresse du puppetmaster dans _/etc/puppet/puppet.conf_ : +~~~ +[agent] +server=puppetmaster.example.net +~~~ + +Puis : +~~~ +/etc/init.d/puppet start +~~~ + +La communication entre l'agent et le maître Puppet se fait en SSL. Lors du premier lancement, l'agent Puppet va alors envoyer automatiquement une demande de certificat (CSR) au maître. + +On peut s'assurer de la bonne connexion entre l'agent et le maître : +~~~ +# puppet agent --test +~~~ +À ce stade, la commande doit retourner une erreur SSL disant que le certificat ne peut être vérifié. + +Sur le maître, on peut lister les certificats ainsi : +~~~ +# puppet cert --list +~~~ + +Et signer le bon certificat : +~~~ +# puppet cert --sign client.example.net +~~~ + +## Utilisation de Puppet + +### Les Manifests + +Les fichiers Manifests (extension _.pp_) sont les « programmes » Puppet. Ils permettent de déclarer des ressources. + +Le fichier de base est _/etc/puppet/manifests/site.pp_. Générallement, il est bon d'éclater les diverses déclarations dans d'autres fichiers/répertoires, et de ne faire que des inclusion dans ce fichier. + +Exemple de fichier ''site.pp' : +~~~ +import "nodes" +~~~ +Ici, on indique d'inclure le fichier _/etc/puppet/manifest/nodes.pp_, qui contiendra la déclaration des différents nœuds recevant leur configuration. + +Exemple de fichier _nodes.pp_ : +~~~ +node myhost.example.net { + # déclaration spécifique à ce nœud +} + +node myhost2.example.net { + # déclaration spécifique à ce nœud +} +~~~ +À noter qu'il est important que le fqdn du nœud qui se connecte au master corresponde à _myhost.example.net_ (dans l'exemple) (cela peut néanmoins se configurer). + +## Exemple + +### Tester un manifest + +Créer le manifest suivant, test.pp + +~~~ + file {'testfile': + path => '/tmp/testfile', + ensure => present, + mode => 0640, + content => "I'm a test file.", + } +~~~ + +Pour vérifier, on peut l'appliquer directement sur le serveur par exemple, avec la commande suivante : + +~~~ +puppet apply test.pp +notice: /Stage[main]//File[testfile]/ensure: created +~~~ + +Modifier les droits du fichiers, puis re-faites un _apply_ : + +~~~ +chmod 777 /tmp/testfile +puppet apply test.pp +notice: /Stage[main]//File[testfile]/mode: mode changed '777' to '640' +~~~ + +### Manifests en Master/Agent (Serveur/Client) + +Sur le serveur il faut faire une liste des nœuds (clients) et quels manifests leur affecter. + +/etc/puppet/manifests/site.pp +~~~ +class test{ + file {'testfile': + path => '/tmp/testfile', + ensure => present, + mode => 0640, + content => "I'm a test file.", + } +} +node client { + include test +} +~~~ + + +### Distribution des fichiers via puppet + +~~~ +#/etc/puppet/fileserver.conf +[files] +path /etc/puppet/files +allow 192.168.0.0/16 +~~~ + +~~~ +class test{ + file {'testfile': + path => '/tmp/testfile', + ensure => present, + mode => 0640, + source => "puppet://master.mondomaine.com/files/apps/sudo/sudoers" + } +} +~~~ \ No newline at end of file diff --git a/HowtoPureFTPD.md b/HowtoPureFTPD.md new file mode 100644 index 00000000..b989b421 --- /dev/null +++ b/HowtoPureFTPD.md @@ -0,0 +1,17 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto PureFTPD + +~~~ +# pure-pw usermod jdoe -N 20000 +# pure-pw show jdoe +~~~ + + +## Ajout d'un utilisateur virtuel + +~~~ +mkdir /home/ftp/foo/ +pure-pw useradd foo -d /home/ftp/foo/ -u 110 -g 65534 +pure-pw mkdb +~~~ \ No newline at end of file diff --git a/HowtoQmail.md b/HowtoQmail.md new file mode 100644 index 00000000..0e7a28f3 --- /dev/null +++ b/HowtoQmail.md @@ -0,0 +1,30 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowtoQmail + +## Rediriger vers un autre serveur SMTP + +~~~ +echo ":le-serveur-smtp.net" > /var/qmail/control/smtproutes +~~~ + +## Vider une mailqueue + +En cas de catastrophe (un serveur OVH par exemple) : + +~~~ +# /etc/init.d/qmail stop +# cd /home/qmail/queue/mess +# for file in `find . -type f` ; do echo $file ; rm -f $file ; rm -f ../info/$file ; rm -f ../remote/$file ; done +# /etc/init.d/qmail start +~~~ + +Ou pour vider avec pattern : + +Exemple, supprime les mails qui contiennent dans les en-têtes : + +~~~ +# python mailRemove.py --real anonymous +~~~ + +Pour reconstruire l'aborescence de _queue_ : diff --git a/HowtoQuagga.md b/HowtoQuagga.md new file mode 100644 index 00000000..6b56732f --- /dev/null +++ b/HowtoQuagga.md @@ -0,0 +1,191 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Quagga + + + +BGP est un protocole de routage, permettant d'échanger des routes entre les opérateurs pour... constituer Internet. +On peut faire tourner un routeur BGP sous BSD (OpenBGPD), Linux (Quagga), Cisco, Juniper, etc. + + + + + + + + + + + + + +## Installation + +Sous Debian Squeeze, on peut installer Quagga 0.99.20.1 : + +~~~ +# aptitude install quagga +~~~ + +## Configuration + +La configuration se passe dans le répertoire _/etc/quagga/_. + +On active _zebra=yes_ et _bgpd=yes_ dans le fichier _daemons_. +Puis on crée un fichier _zebra.conf_ du type : + +~~~ +! Config Quagga +hostname test +password 1234 +enable password 5678 +~~~ + +Puis un fichier _bgpd.conf_ du type : + +~~~ +! Config Quagga BGP +router bgp 65001 +bgp router-id 10.0.0.1 +network 10.0.0.0/8 +neighbor 10.0.0.2 remote-as 65002 +log file /var/log/quagga/bgpd.log +line vty +~~~ + +On peut alors démarrer Quagga ainsi : + +~~~ +# /etc/init.d/quagga start +Loading capability module if not yet done. +Starting Quagga daemons (prio:10): bgpd. +line vty +~~~ + +Et l'on peut se connecter interactivement à un shell Quagga (Cisco-like) : + +~~~ +# vtysh + +Hello, this is Quagga (version 0.99.20.1). +Copyright 1996-2005 Kunihiro Ishiguro, et al. + +test# show version +Quagga 0.99.20.1 (). +Copyright 1996-2005 Kunihiro Ishiguro, et al. +~~~ + +ou alors en telnet (accès plus limité a priori) : + +~~~ +$ telnet 127.0.0.1 2601 +Trying 127.0.0.1... +Connected to 127.0.0.1. +Escape character is '^]'. + +Hello, this is Quagga (version 0.99.20.1). +Copyright 1996-2005 Kunihiro Ishiguro, et al. + + +User Access Verification + +Password: +test> en +Password: +test# +~~~ + +Quelques commandes : + +~~~ +# conf t +test(config)# +test-quagga(config)# exit + +# write +Building Configuration... +Configuration saved to /etc/quagga/zebra.conf +Configuration saved to /etc/quagga/bgpd.conf +[OK] + +# show interface +# show interface description +# show memory +# show running-config +# show ip bgp +# show ip bgp summary +# show ip bgp neighbors +# show ip route +# show bgp summary + +# debug bgp +# debug bgp updates + +test(config)# ip route 1.2.3.0/24 10.0.0.5 +~~~ + +## Exemple de 2 firewalls connectés à 2 routeurs du même AS + +Afin de gérer une bascule automatique, voici un exemple de configuration +de 2 firewalls (actif/passif) connectés à 2 routeurs (actif/actif) d'un même AS. +Les 2 firewalls annonceront leur réseau, et les 2 routeurs la route _default_ + +Voici la configuration sur le firewall actif : + +~~~ +!debug bgp events +!debug bgp filters +!debug bgp fsm +!debug bgp keepalives +!debug bgp updates + +router bgp 65001 + bgp router-id 192.168.0.41 + bgp log-neighbor-changes + network 1.2.3.0/24 + no synchronization + no auto-summary + +neighbor 192.168.0.37 remote-as 1234 +neighbor 192.168.0.37 soft-reconfiguration inbound +neighbor 192.168.0.38 remote-as 1234 +neighbor 192.168.0.38 soft-reconfiguration inbound + +log file /var/log/quagga/bgpd.log +line vty +~~~ + +Sur le firewall passif, c'est similaire, on ajoute juste un as-preprend +pour qu'il ne soit choisit qu'en cas de coupure avec le firewall actif : + +~~~ +!debug bgp events +!debug bgp filters +!debug bgp fsm +!debug bgp keepalives +!debug bgp updates + +router bgp 65001 + bgp router-id 192.168.0.42 + bgp log-neighbor-changes + network 1.2.3.0/24 + no synchronization + no auto-summary + +neighbor 192.168.0.37 remote-as 1234 +neighbor 192.168.0.37 route-map ANNONCEMYNET out +neighbor 192.168.0.37 soft-reconfiguration inbound +neighbor 192.168.0.38 remote-as 1234 +neighbor 192.168.0.38 route-map ANNONCEMYNET out +neighbor 192.168.0.38 soft-reconfiguration inbound + +log file /var/log/quagga/bgpd.log +line vty + +route-map ANNONCEMYNET permit 100 + set as-path prepend 65001 65001 +~~~ + +Il reste en général à mettre en place une IP load-balancée sur le LAN +entre le firewall actif et passif, IP qui sera la gateway des machines internes. +Par exemple, via _keepalived_. \ No newline at end of file diff --git a/HowtoQuota.md b/HowtoQuota.md new file mode 100644 index 00000000..57904974 --- /dev/null +++ b/HowtoQuota.md @@ -0,0 +1,38 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Quota + +## Mise en place + +~~~ +# apt install quota +~~~ + +Ajouter _usrquota_ et/ou _grpquota_ dans les partitions concernées du fichier /etc/fstab exemple : + +~~~ +/dev/sdb1 /home ext4 defaults,noexec,nosuid,nodev,grpquota 0 2 +~~~ + +~~~ +# mount -o remount /home +# quotacheck -cgfmv /home/ +# quotaon /home +~~~ + +Temps de grâce pour le quota de groupe : + +~~~ +# edquota -g -t +~~~ + +## FAQ + +### Erreur : warnquota: Parse error at line 42. Cannot find end of group name + +~~~ +# warnquota -g +warnquota: Parse error at line 42. Cannot find end of group name. +~~~ + +Problème à la ligne 42 du fichier /etc/quotagrpadmins \ No newline at end of file diff --git a/HowtoRails.md b/HowtoRails.md new file mode 100644 index 00000000..07902cab --- /dev/null +++ b/HowtoRails.md @@ -0,0 +1,320 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Rails + + + +Mettre en place un environnement de production "Ruby On Rails" exige de trouver les bons compromis +entre les composants système - stable et robuste par nature - et l'environnement de développement +"Ruby On Rails" très volatile et changeant. Voici comment nous mettons cela en oeuvre. + +## Cas 1 : utilisation avec Passenger + +* [Documentation de Passenger pour Apache](http://modrails.com/documentation/Users%20guide%20Apache.html) +* [Documentation de Ruby Enterprise Edition](http://www.rubyenterpriseedition.com/documentation.html) +* [Un howto pour Yaml](http://www.yaml.org/YAML_for_ruby.html) (en parallèle avec Ruby, mais simple à comprendre) + +### Installation + +On installe d'abord Ruby 1.8 et ses dépendances utiles (`irb`, `rdoc`, `ri`, …). + +~~~ +# aptitude install ruby-full irb rubygems rails libactionpack-ruby1.8 libactionmailer-ruby1.8 +~~~ + +Installer les bindings MySQL et OpenSSL (voir [#les-gems Les gems]) : + +~~~ +# aptitude install libmysql-ruby libopenssl-ruby libmysqlclient15-dev +~~~ + +### Les gems #les-gems + +Les gems sont des paquets contentant des librairies et/ou des applications écrites en Ruby. Elles sont énormément utilisées, notamment dans Rails. + +Par défaut, aucune librairie n'est installée sous forme de gem à part les bindings MySQL et Rack (qui est une dépendance de Passenger) +Il est préférable d'installer les bindings MySQL à la main (`libmysql-ruby`) car ils nécessitent la compilation d'extensions en C et +risquent d'être utilisés par tous les utilisateurs. + +OpenSSL fait normalement partie de la librairie standard Ruby, mais n'est pas inclus dans Debian. Rails en a besoin pour fonctionner, il convient +donc d'installer `libopenssl-ruby` manuellement. + +### Ruby Enterprise Edition (REE) + +REE est une version patchée de Ruby optimisée pour les applications Web et créée par les mêmes développeurs que Passenger. +REE est donc censé s'intégrer parfaitement avec Passenger. + +Des paquets (ubuntu) existent pour REE, mais le plus simple est de le compiler à la main. +Par défaut il s'installera dans le dossier `/opt`, en totale isolation du reste du système. +Rubygems est livré avec REE, et est placé dans le dossier de ce dernier. + +Il suffit de récupérer une [archive des sources sur le site de REE](http://rubyenterpriseedition.com), +de la décompresser et de lancer le script `./installer --no-dev-docs` en tant que root. Le reste de la procédure est indiqué +par l'installateur. + +À noter qu'il faut avoir installé les paquets `libreadline-dev`, `libz-dev`, `libssl-dev` et avoir une suite de +compilation fonctionnelle (gcc, g++, make, patch, …) + +### Utilisation avec Passenger + +Passenger est livré avec REE sous forme de gem, on peut donc l'installer juste après REE. Le mode d'installation est alors quelque peu différent : + +Avant tout on installe toutes les librairies nécessaires : celles de REE listées précédemment, plus les libs de développement d'Apache + +~~~ +# aptitude install libreadline-dev libz-dev libssl-dev apache2-prefork-dev libcurl4-openssl-dev +~~~ + +On installe ensuite REE selon la procédure définie ci-dessus, et une fois cette installation terminée, on lance la commande : + +~~~ +/opt/ruby-enterprise-/bin/passenger-install-apache2-module +~~~ + +L'installateur nous guide dans la procédure. Dans le cas ou le MPM d'Apache est ITK, il préviendra : + +~~~ +WARNING: Apache doesn't seem to be compiled with the 'prefork' or 'worker' MPM +~~~ + +On peut cependant continuer l'installation en ignorant l'avertissement. Une fois terminée, l'installateur donne la configuration pour Apache + +Dans `/etc/apache2/mods-available/passenger.load` on mettra la ligne : + +~~~ +LoadModule passenger_module /opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/passenger-3.0.0/ext/apache2/mod_passenger.so +~~~ + +et dans `/etc/apache2/mods-available/passenger.conf` : + +~~~ + + PassengerRoot /opt/ruby-enterprise-/lib/ruby/gems/1.8/gems/passenger-3.0.0 + PassengerRuby /opt/ruby-enterprise-/bin/ruby + + PassengerEnabled off + #RailsAutoDetect off + #RackAutoDetect off + PassengerFriendlyErrorPages off + + +~~~ + +Puis : `a2enmod passenger` + +Une fois REE installé il reste un dernier soucis, les binaires sont dans `/opt/ruby-enterprise-/bin`, +et pour que les utilisateurs puissent les utiliser il y a deux options possibles : + +1. Rajouter ce chemin dans le PATH par défaut de tous les utilisateurs. +1. Créer des liens symboliques dans `/usr/bin`. + +Pour la deuxième solution, le script suivant permet d'automatiser la tâche : + +~~~ +#!/bin/bash +cd /usr/bin +for i in `ls -1d /opt/ruby-enterprise-*/bin/*`; do + ln -s $i +done +~~~ + + +### Configuration de Passenger/mod_rails + +Par défaut, Passenger est activé pour tous les sites d'Apache et propose une auto-détection des environnements Rails et Rack, +on commence par désactiver ce comportement dans `/etc/apache2/mods-available/passenger.conf` : + +~~~ + + PassengerRoot /usr + PassengerRuby /usr/bin/ruby1.8 + + # On ajoute les lignes suivantes: + PassengerEnabled off + RailsAutoDetect off + RackAutoDetect off + + PassengerTempDir /var/tmp/ + PassengerUploadBufferDir /var/tmp + # S'assurer que les permissions sur le dossier permettent à Apache d'écrire dedans + # cf. + # C'est surtout important avec Apache ITK ! + +~~~ + +### Exemple de VirtualHost pour Rails + +~~~ + + ServerName redmine.evolix.net + PassengerEnabled on + RailsAutoDetect on + + DocumentRoot /home/redmine/www/public + + Allow from all + Options -MultiViews + + + # Pour Apache 2 ITK + AssignUserID {user} {group} + +~~~ + +* [#apache-itk-users Information complémentaire sur Apache ITK] +* [Script de génération de VHost](http://forge.evolix.org/scm/viewvc.php/trunk/scripts/create_rails_vhost?view=markup&root=packweb) + +### Trucs, astuces et détails + +#### Apache ITK #apache-itk-users + +Passenger détermine sous quel utilisateur il va lancer l'application en se basant sur le propriétaire du fichier +`config/environment.rb` de l'application Rails. + +Il faut donc y placer un propriétaire identique à celui utilisé dans AssignUserID + +#### Les environnements de Rails + +Rails propose trois environnements d'exécution distincts : `production`, `development` et `test`. + +Chacun a un but précis facilement devinable depuis son nom. + +Par défaut, Passenger fait tourner l'application en mode production. On peut forcer un certain environnement +en plaçant la directive `RailsEnv ` dans le fichier de configuration du VHost. + +Pour lancer dans un certain environnement les commandes qui agissent avec l'application (par exemple les +tâches [Rake](http://guides.rubyonrails.org/command_line.html#rake-is-ruby-make)), il suffit de définir la +variable d'environnement RAILS_ENV, par exemple : + +~~~ +$ RAILS_ENV=production rake db:migrate +~~~ + +#### Redémarrage de l'application + +Pour redémarrer une application Rails, il suffit de créer ou de mettre à jour le timestamp du fichier +`tmp/restart.txt` (avec la commande `touch` par exemple). À la prochaîne requête, l'application sera +redémarrée et tout l'environement chargé de nouveau. + +Pour que l'application redémarre à chaque requête on peut aussi créer un fichier `tmp/always_restart.txt` +et le supprimer une fois qu'on ne souhaite plus ce comportement. + +#### `umask`s spéciaux + +Sur certains système, l'umask par défaut rend les fichiers installés par root non lisibles par le commun des utilisateurs. +Si celà est une bonne idée, combinée avec Rubygems et Apache ITK, celà devient moins évident, et il faut veiller +à `chmod`er correctement le dossier de Ruby pour que tous les utilisateurs puissent l'utiliser. + +Un exemple avec REE : + +~~~ +# chmod -R u=rwX,g=rX,o=rX /opt/ruby-enterprise-1.8.7-2010.02/ +~~~ + +#### Priorités de chargement + +Par défaut, même lorsque `rubygems` est activé, Ruby utilisera en priorité les librairies système +(celles installées par les paquets) plutôt que les gems. On peut cependant forcer l'utilisation d'une gem, +et même fixer la version désirée (sinon c'est la plus récente qui est automatiquement utilisée). + +Cette gestion des versions doit être faite par le développeur, qui peut installer les librairies qu'il souhaite indépendamment du système. +L'important est de savoir qu'il y a trois endroits ou on peut trouver une librairie Ruby : + +* Installée par un paquet (`/usr/lib/ruby/1.8/`) +* Installée en temps que gem système (`/var/lib/gems/1.8/`) +* Installée en temps que gem utilisateur (`~/.gem/ruby/1.8/`) + +#### Lister les gems + +Il n'existe pas de moyen de lister les gems installées uniquement sur le système, la commande `gem` cherche +à la fois dans le dossier `.gem` de l'utilisateur et le dossier système. La solution est d'utiliser un script +spécialisé qui fait cette recherche. + +Le script est disponible dans le dépôt Subversion du Pack Web Evolix, dans +[trunk/scripts/list_gems](http://forge.evolix.org/scm/viewvc.php/trunk/scripts/list_gems?view=markup&root=packweb). + +#### Économiser un peu d'espace + +Par défaut, `gem` installe la documentation aux formats RDoc (documentation html) et RI (documentation console) +pour les gems installées. Pour éviter celà, créer un fichier `.gemrc` dans la `$HOME` de l'utilisateur avec le +contenu suivant : + +~~~ +gem: --no-rdoc --no-ri +~~~ + +À mettre aussi dans la `$HOME` de `root` si c'est lui qui installe les gems. + +#### Rails 2.3.2->2.3.5 & Passenger & les logs + +Une petite erreur en environnement de production affecte les versions 2.3.2 à 2.3.5 (incluse) de Rails. Les logs +de l'application ne sont pas écrits dans le fichier `log/production.log`. Pour pallier cette erreur, il faut appliquer +le patch qu'on trouve [ici](https://rails.lighthouseapp.com/projects/8994/tickets/3577-failsafe-middleware-should-flush-the-logger) +(deuxième fichier). + +#### Répertoire temporaire de Passenger + +Passenger stocke tous ses fichiers temporaires dans le répertoire /tmp/ par défaut. Pour diverses raisons (de place, de droits voire de performance), il peut être intéressant d'en définir un autre. Cela ce fait via la directive Apache du module Passenger _PassengerTempDir_. Par exemple, nous mettons : +~~~ +PassengerTempDir /var/tmp/ +~~~ + +### Mise à jour de Passenger + +Passenger est installé en tant que gem dans _/opt/ruby-enterprise-/lib/ruby/gems/1.8/gems/_. +Voici la procédure pour le mettre à jour : +~~~ +gem update passenger +~~~ +~~~ +/opt/ruby-enterprise-/lib/ruby/gems/1.8/gems/passenger-/bin/passenger-install-apache2-module +~~~ +Puis modifier les chemins vers mod_passenger dans la conf d'Apache _/etc/apache2/mod-available/passenger_.{conf,load} pour pointer vers la nouvelle version (notamment les directives _LoadModule_ et _PassengerRoot_). +Enfin, redémarrer Apache pour prendre en compte le nouveau module. + +### Mise à jour de REE + +Pour mettre à jour REE, il suffit de recommencer la procédure d'installation, la nouvelle version sera installé dans /opt/ruby-enterprise- et ne perturbera donc pas la prod existante. + +Pour prendre en compte la nouvelle installation de REE, il faut modifier les chemins vers REE dans la configuration d'Apache. + +*Important :* pour la migration de REE 1.8.7-2010.02 vers 1.8.7-2011.01, il faut ajouter cette directive dans la configuration d'Apache : +~~~ +RackBaseURI / +~~~ +Et enlever les éventuelles directives `RailkBaseURI`. + + +## Cas 2 : utilisation avec rbenv + Unicorn + +*rbenv* permet d'avoir un environnement compilé par utilisateur. +C'est donc le développeur qui gère sa version de Ruby, ses Gems, etc... +on ne lui installe même pas Ruby ! + +Note préalable : mettre les droits _exec_ sur la partition /home + +~~~ +# aptitude install build-essential curl mg +~~~ + +~~~ +# aptitude install python-pygments zlib1g-dev libxml2-dev \ + libxslt1-dev libmysqlclient-dev libcurl4-openssl-dev \ + libmagickcore-dev libmagickwand-dev libreadline-dev imagemagick +~~~ + +~~~ +$ git clone git://github.com/sstephenson/rbenv.git .rbenv +$ git clone git://github.com/sstephenson/ruby-build.git .rbenv/plugins/ruby-build +$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile +$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile +$ . .bash_profile +$ rbenv install 1.9.2-p290 +$ rbenv global 1.9.2-p290 +~~~ + +Astuces diverses : + +~~~ +rails_env = `head -1 $(HOME}/www/current/config/database.yml | tr ':' ' '` +~~~ diff --git a/HowtoRaspberryPi.md b/HowtoRaspberryPi.md new file mode 100644 index 00000000..e3118bc7 --- /dev/null +++ b/HowtoRaspberryPi.md @@ -0,0 +1,51 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Howto Installer Système sur RaspberryPi + +Ici sera expliqué comment installer un système sur RaspberryPi. La méthode reste assez similaire pour les différents systèmes, il est donc possible de garder une des procédures suivantes pour un système non listé ci-dessous. + +### Raspbian + +### Lakka + +Matériel requis : + +* Un RaspberryPi +* Un cable USB/MicroUSB (optionnel : un adaptateur secteur) +* Une manette de jeu (Ps3, Xbox, Freebox, ...). Le système n'a pas été testé avec un clavier +* Une carte SD (4Go minimum conseillé) +* Un cable HDMI +* Optionnel : un cable ethernet (afin de pouvoir transferer les jeux sur le réseau local* + +Procédure à suivre : + +* Télécharger le .zip de l'image système Lakka sur le site officiel Lakka.tv +* Utiliser la ligne de commande gunzip pour extraire le .img depuis le .zip ou utiliser un outil graphique dedié +~~~ + $ ls -l /dev/sd* +~~~ + +* La commande ci-dessus va montrer les partitions accessibles ainsi que leur numéro. sda peut par exemple être le disque dur +* Monter la carte SD sur un ordinateur sous linux (possible sous autre OS mais non expliqué ici) +~~~ + Executer à nouveau + $ ls -l /dev/sd* + Cela devrait afficher les mêmes partitions que précédemment avec la carte SD en plus + + $ sudo dd if=Lakka-*.img of=/dev/sdX + Où Lakka-*.img est le chemin vers le .img extrait précedemment et sdX la carte SD (remplacer X par la lettre trouvée précedemment +~~~ +*L'étape devrait prendre quelques petites minutes (même moins) +* Retirer en toute sécurité la carte SD et la placer dans le RaspberryPi +* Brancher le HDMI entre le Raspberry et l'écran +* Allumer l'écran +* Brancher le cable ethernet (optionnel) +* Brancher la manette USB sur l'un des ports USB +* Brancher l'alimentation du Raspberry (cable USB/microUSB) + + L'icône Lakka devrait apparaitre. + Après quelques configurations automatiques, le menu Lakka devrait apparaitre. +* Si vous avez branché le cable ethernet, le Raspberry apparaitra sur vos autres ordinateurs dans le réseau local. Il est ensuite possible de remplir la carte SD de jeu dans le dossier ROMs s'y trouvant. Les images des jeux sont à placer, pas les .zip ou autre formats compressés. +* Aller dans "Load Content (Detect Core) afin d'avoir la liste des jeux envoyés par ethernet + + Bon jeu! diff --git a/HowtoRedis.md b/HowtoRedis.md new file mode 100644 index 00000000..297e99a9 --- /dev/null +++ b/HowtoRedis.md @@ -0,0 +1,356 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Redis + +Redis est un serveur noSQL clé-valeur. Une valeur peut être une chaîne de caractères, un tableau, une liste, etc. +Redis tourne en mémoire, et sauvegarde de temps en temps ses données sur le disque. + + + +## Installation + +*Sous Debian Squeeze*, la version de Redis est 1.2.6 : + +~~~ +# aptitude install redis-server +~~~ + +Si l'on a besoin d'une version 2 de Redis, il faut +utiliser les backports Squeeze. Voici un pinning pour cela : + +~~~ +Package: redis-server +Pin: release a=squeeze-backports +Pin-Priority: 999 +~~~ + +*Sous Debian Jessie*, on installe Redis de la même manière (version 2.8.1). Si on utilise systemd, on surcharge l'unit redis.service en spécifiant le RuntimeDirectory (voir la note +[wiki:HowtoDebian/MigrationWheezyJessie#Redis ici]). + +## Configuration + +La configuration principale se fait dans _/etc/redis/redis.conf_ dont voici +quelques options : + +~~~ +daemonize yes +pidfile /var/run/redis.pid +port 6379 +unixsocket /var/run/redis/redis.sock +bind 127.0.0.1 +timeout 300 +loglevel notice +logfile /var/log/redis/redis-server.log +databases 16 +save 900 1 +save 300 10 +save 60 10000 +dbfilename dump.rdb +dir /var/lib/redis +#requirepass +maxclients 128 +maxmemory 104857600 +~~~ + +La plupart des options sont reconfigurables en mode CLI via la commande _CONFIG SET_. +La liste des arguments peut être listée : + +~~~ +redis> CONFIG get * + 1) "dir" + 2) "/var/lib/redis" + 3) "dbfilename" + 4) "dump.rdb" + 5) "requirepass" + 6) (nil) + 7) "masterauth" + 8) (nil) + 9) "maxmemory" +10) "0" +~~~ + +## Utilisation + +En mode CLI : + +~~~ +$ redis-cli -s /var/run/redis/redis.sock +$ redis-cli +redis 127.0.0.1:6379> +redis> set foo 3 +OK +redis> get blabla +(nil) +redis> get foo +3 +redis> keys * +1) "foo" +redis> mset un 1 deux 2 trois 3 quatre 4 +OK +redis> keys * +1) "un" +2) "foo" +3) "deux" +4) "trois" +5) "quatre" +redis> *keys *r* +1) "four" +2) "three" +redis> get four +"4" +redis> del "trois" "quatre" +(integer) 2 +~~~ + +Mais aussi en réseau (sans authentification, attention) : + +~~~ +$ telnet 127.0.0.1 6379 +Trying 127.0.0.1... +Connected to 127.0.0.1. +Escape character is '^]'. +get foo +$1 +3 +quit +Connection closed by foreign host. +~~~ + +En PHP, il existe différentes bibliothèques. Nous utilisons principalement +et nous utilisons un fork pour avoir un packaging Debian propre : + +~~~ +$ git clone +$ cd phpredis +$ tar --exclude debian --exclude .git -cvzf ../php5-redis_0.1~git20120519.orig.tar.gz . +$ git-buildpackage -us -uc +~~~ + +## Sessions PHP avec Redis + +Redis peut notamment être utilisé pour stocker les sessions PHP. Par exemple : + +~~~ +session.save_handler = redis +session.save_path = "tcp://127.0.0.1:6379?auth=" +~~~ + +## Instances Redis + +Il peut être pratique de lancer plusieurs instances Redis sur un même serveur. + +Pour cela on copiera le fichier _redis.conf_ en ajustant les directives _pidfile_, _port_, _unixsocket_, _logfile_ et _dbfilename_. +Il faudrait ensuite copier le script d'init.d en ajustant les variables RUNDIR, PIDFILE, DAEMON_ARGS et DESC + +## Sauvegardes + + + +Par défaut, Redis sauvegarde de temps en temps ses données sur le disque (mode RDB persistence). +Il suffit donc de copier ce fichier pour sauvegarder une base Redis à chaud ! + +Pour restaurer les données, il suffira d'éteindre Redis, remettre en place le fichier RDB, et relancer Redis. + +## Réplication + + + +Côté "slave" il suffit de mettre en place la configuration : + +~~~ +slaveof 192.0.43.10 6379 +#masterauth +~~~ + +Une fois le démon relancé on peut vérifier l'état de la réplication de la façon suivante : + +~~~ +#redis-cli -h X.X.X.X -p 6379 info replication +~~~ + +On peut arrêter la réplication et passer un slave en master + +~~~ +#redis-cli -h X.X.X.X -p 6379 slaveof no one +~~~ + +~~~ +#redis-cli -h X.X.X.X -p 6379 info replication +# Replication +role:master +connected_slaves:1 +master_repl_offset:631177410 +repl_backlog_active:0 +repl_backlog_size:1048576 +repl_backlog_first_byte_offset:630128835 +repl_backlog_histlen:1048576 +~~~ + +### Tests + +On test une écriture sur le master, est-ce répliqué sur le slave ? + + +~~~ +redis [master] 127.0.0.1:6379> set key value +redis [slave] 127.0.0.1:6379> get key +~~~ + +On devrait avoir « value ». Par ailleurs on pourra lire dans les logs du slave (/var/log/redis/redis-server.log) : + + +~~~ +[26287] 06 Sep 15:04:04 * MASTER <-> SLAVE sync: receiving 34 bytes from master +~~~ + + + +Depuis redis 2.6 (2.4 en Wheezy), par défaut, le slave est en read-only, on peut le passer en read & write, en mettant ceci dans la configuration du slave : + + +~~~ +slave-read-only off +~~~ + + +### Sentinel + +Sentinel permet de faire du failover avec des slaves Redis. +Attention, il est encore en développement. Il est donc dans la branche instable du dépôt de redis. +Par ememple, une instance master redis1 et un slave redis2. En cas de panne les rôles s'échangent, redis2 devient master et redis1 devient le slave. + +## Benchmarks + + + +~~~ +redis-benchmark -n 100000 +=##### PING (inline)= + 100000 requests completed in 1.88 seconds + 50 parallel clients + 3 bytes payload + keep alive: 1 + +97.82% <= 1 milliseconds +99.80% <= 2 milliseconds +99.89% <= 3 milliseconds +99.93% <= 4 milliseconds +99.93% <= 5 milliseconds +100.00% <= 6 milliseconds +100.00% <= 6 milliseconds +53276.50 requests per second + +=##### PING= + 100000 requests completed in 1.97 seconds + 50 parallel clients + 3 bytes payload + keep alive: 1 + +93.58% <= 1 milliseconds +99.36% <= 2 milliseconds +99.61% <= 3 milliseconds +99.71% <= 4 milliseconds +99.81% <= 5 milliseconds +99.87% <= 6 milliseconds +99.88% <= 7 milliseconds +99.88% <= 8 milliseconds +99.92% <= 10 milliseconds +99.93% <= 11 milliseconds +99.93% <= 12 milliseconds +99.95% <= 13 milliseconds +100.00% <= 13 milliseconds +50761.42 requests per second + +=##### MSET (10 keys)= + 100000 requests completed in 3.12 seconds + 50 parallel clients + 3 bytes payload + keep alive: 1 + +19.71% <= 1 milliseconds +91.36% <= 2 milliseconds +98.93% <= 3 milliseconds +99.66% <= 4 milliseconds +99.75% <= 5 milliseconds +99.76% <= 8 milliseconds +99.77% <= 9 milliseconds +99.77% <= 10 milliseconds +99.80% <= 11 milliseconds +99.80% <= 14 milliseconds +99.85% <= 15 milliseconds +99.89% <= 22 milliseconds +99.89% <= 23 milliseconds +99.94% <= 24 milliseconds +99.95% <= 160 milliseconds +99.95% <= 208 milliseconds +99.95% <= 245 milliseconds +99.95% <= 246 milliseconds +100.00% <= 246 milliseconds +32020.49 requests per second + +=##### SET= + 100000 requests completed in 1.86 seconds + 50 parallel clients + 3 bytes payload + keep alive: 1 + +97.80% <= 1 milliseconds +99.78% <= 2 milliseconds +99.84% <= 3 milliseconds +99.87% <= 4 milliseconds +99.93% <= 5 milliseconds +99.95% <= 10 milliseconds +99.96% <= 11 milliseconds +100.00% <= 12 milliseconds +100.00% <= 12 milliseconds +53850.30 requests per second + +=##### GET= + 100000 requests completed in 2.02 seconds + 50 parallel clients + 3 bytes payload + keep alive: 1 + +91.26% <= 1 milliseconds +99.65% <= 2 milliseconds +99.86% <= 3 milliseconds +99.89% <= 4 milliseconds +99.92% <= 5 milliseconds +99.97% <= 7 milliseconds +100.00% <= 7 milliseconds +49407.12 requests per second + +[etc.] +~~~ + +## Monitoring + +### Nagios + +Un check Nagios « basique » consiste à initier une connexion TCP sur le socket unix du serveur Redis, et s'assurer qu'il répond bien : +~~~ +command[check_redis]=/usr/lib/nagios/plugins/check_tcp -H /var/run/redis.pid +~~~ + +Des checks Nagios avancés existent également, notamment pour surveiller la réplication ou pour retourner diverses info sur le status du serveur : + +* +* + +Ces 2 plugins nécessitent de se connecter via un socket réseau au serveur, mais une [version antérieure](https://github.com/shift/nagios-check-redis/commit/16ee166aecd7b617c21dc8138a61829f506dc34c) de _nagios-check-redis_ supporte les sockets unix. + +### Munin + +* Un plugin Munin existe pour grapher divers paramètres comme la mémoire utilisée par Redis, le nombre de clés utiliséees, le nombre de requêtes par seconde, et le nombre de clients connectés. + +Il est disponible ici : + +Vous devez renseigner la variable _env.path_ avec le chemin vers le socket unix du démon Redis, dans le fichier _/etc/munin/plugin-conf.d/munin-node_. + +* Un autre plugin, fonctionnel sous Jessie est disponible ici : + +Pour l'installer, spécifier env.password si nécessaire dans une section [redis_*] et : +~~~ +# ln -s '/usr/share/munin/plugins/redis_' '/etc/munin/plugins/redis_127.0.0.1_6379' +# /etc/init.d/munin-node restart +~~~ \ No newline at end of file diff --git a/HowtoRedmineGitHosting.md b/HowtoRedmineGitHosting.md new file mode 100644 index 00000000..5c735819 --- /dev/null +++ b/HowtoRedmineGitHosting.md @@ -0,0 +1,52 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowtoRedmineGitHosting + +[Redmine Git Hosting](http://redmine-git-hosting.io/) est un plugin permettant l'intégration de [Redmine](https://redmine.org/) avec [Gitolite](http://gitolite.com). + +Il est edité par la société [Jbox Web](http://www.jbox-web.com/). + +## Ajout de clé SSH + +Pour ajouter une clé SSH à son compte il suffit de se rendre dans *Mon Compte* -> *Mes clés publiques* et de copier sa clé publique (.pub). + +## Création d'un dépôt + +Pour créer un dépôt, il faut se rendre dans la configuration d'un projet puis : + +- Activer le module *Dépôt de sources* dans *Modules* + +- Cliquer sur *Nouveau dépôt* dans *Dépôts* + +- Choisir le *SCM* Gitolite + +- Si l'identifiant est vide, le nom du projet sera utilisé par défaut + +## Accès au dépôts + +Les droits d'accès sont gérés au niveau des projets Redmine + +Les membres du projet Redmine auront accès au dépôts du projet suivant leur rôles (Editable dans *Administration* -> *Rôles et permissions*) + +Pour qu'un dépôt soit public, il faut que le projet parent soit aussi public + +Attention un dépôt privé dans un projet public sera quand même public + +## Notification Git + +Les notifications Git se configure dans *Administration* -> *Redmine Git Hosting* -> *Notifications* + +On peut changer le *Préfixe global des notifications* qui s'ajoute dans le sujet des mails, ex : *[REDMINE]*, *[GIT]*, *[FORGE EVOLIX]* + +Choisir l' *Adresse de l'expéditeur des notifications*, ex: forge.evolix.org + +## Mirroring Github + +Pour créer un mirroir d'un de vos dépot sur Github il faut : + +- Copier la clé publique de Redmine dans votre compte Github + +- Créer un dépôt d'accueil sur Github + +- Cliquer sur *Dépôt* -> *Configuration* -> *Mirroirs du dépôt* -> '''Ajouter un miroir de dépôt +Miroirs du dépôt''' \ No newline at end of file diff --git a/HowtoRsync.md b/HowtoRsync.md new file mode 100644 index 00000000..2cbba19b --- /dev/null +++ b/HowtoRsync.md @@ -0,0 +1,19 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto rsync + +## FAQ + +Q : J'obtiens une erreur de ce type : + +~~~ +Write failed: Broken pipe +rsync: connection unexpectedly closed (128109911 bytes received so far) [receiver] +rsync error: error in rsync protocol data stream (code 12) at io.c(601) [receiver=3.0.7] +rsync: connection unexpectedly closed (128109911 bytes received so far) [generator] +rsync error: unexplained error (code 255) at io.c(601) [generator=3.0.7] +~~~ + +R : cela peut venir dans certains cas d'un routeur coupant agressivement les sessions en cas d'inactivité. + Dans ce cas, une solution est d'ajouter l'option suivante en Rsync Over SSH : `-e "ssh -o ServerAliveInterval=5"` + diff --git a/HowtoRsyslog.md b/HowtoRsyslog.md new file mode 100644 index 00000000..5a79d9a1 --- /dev/null +++ b/HowtoRsyslog.md @@ -0,0 +1,26 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Howto Rsyslog + +Rsyslog est le remplaçant de syslogd à partir de Debian Lenny. + +### Rotation dynamique des logs + +Cela permet d'écrire automatiquement dans un fichier dont le nom est fonction de la date par exemple. +Du coup il n'est plus utile de gérer sa rotation (uniquement la compression). + +~~~ +$template DailyPerHostLogs,"/var/log/local2-%$YEAR%-%$MONTH%-%$DAY%.log" +local2.* -?DailyPerHostLogs +~~~ + +## Activation en réseau + +Pour que Rsyslog écoute en UDP sur réseau (port 514 par défaut) : + +~~~ +# provides UDP syslog reception +$ModLoad imudp +$UDPServerRun 514 +~~~ + diff --git a/HowtoSNMP.md b/HowtoSNMP.md new file mode 100644 index 00000000..79c5e0b2 --- /dev/null +++ b/HowtoSNMP.md @@ -0,0 +1,154 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +* +* Nagios +* +* cacti +* jffnms +* +* NetDisco +* Cricket +* BigBrother +* BigSister +* REMSTATS +* Sysmon +* Ntop + + +## Principe de fonctionnement + +SNMP (pour Simple Network Management Protocol) est un protocole qui permet la supervision d'équipements réseau (serveurs, routeurs, switchs...). Il utilise le protocole de transort UDP sur le port 161. + +Il se base sur 3 éléments : + +* Le manager (ou superviseur) : Il centralise tous les données qu'il collecte sur les nœuds ; +* Les nœuds sont les équipements informatiques à superviser ; +* Les agents sont des démons qui tournent en permanence sur les nœuds pour répondre aux requêtes du manager. + +Toutes les données qu'un agent fournit sont référencés dans une MIB, accessible grâce à un OID. Une MIB (Management Information Base) est une base de données dans laquelle les informations sont classées sous forme d'arbre. Chaque information est alors accessible par son OID (Object Identifier), qui est en fait le chemin hiérarchique de l'élément. +Par exemple, 1.3.6.1.2.1.2.2.1.2 est l'OID ifDescr qui est la chaîne de caractères décrivant une interface réseau. + +Le protocole SNMP peut également être utilisé pour modifier des valeurs dans la MIB (donc plus seulement superviser, mais administrer). + +Du point de vue de la sécurité, la version 3 du protocole permet d'utiliser une communauté (utilisé comme mot de passe) pour pouvoir lire ou écrire dans la MIB. + + +## Mise en place + +Le principe est d'installer sur toutes les machines un agent SNMP (SNMPD = NET SNMP Agent) +Et sur le poste de contrôle du réseau, on installera un client/manager SNMP +destiné à recueillir les informations des agents SNMP... + +~~~ + ,-- (SNMP) ---> Agent 1 +Client/manager <---- (SNMP) ---> Agent 2 + `-- (SNMP) ---> Agent 3 + ... +~~~ + + +### Configuration de l'agent + +Par défault, snmpd n'écoute que sur 127.0.0.1. Cela peut se changer dans le fichier /etc/default/snmpd : +~~~ +SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid IP' +~~~ + +IP peut même être omis pour écouter sur toutes les interfaces. + +Fichier snmpd.conf : +~~~ +# read-only de tout sur le reseau local +com2sec local 192.168.0.0/16 public +group ROGroup v1 local +view all included .1 +access ROGroup "" any noauth exact all none none + +syslocation DTC +syscontact Gregory Colpart +~~~ + +~~~ +/etc/init.d/snmpd restart +~~~ + +### Interrogation de la MIB de l'agent + +~~~ +8:~$ snmpget -v 1 -c public routeur system.sysContact.0 +SNMPv2-MIB::sysContact.0 = STRING: Gregory Colpart +8:~$ snmpget -v 1 -c public routeur system.sysLocation.0 +SNMPv2-MIB::sysLocation.0 = STRING: DTC +$ snmpget -v 1 -c public routeur system.sysDescr.0 +SNMPv2-MIB::sysDescr.0 = STRING: Linux routeur 2.4.31-grsec-fw-i386 #1 Tue Aug 23 12:18:10 CEST 2005 i586 +~~~ + +OID pour l'uptime = .1.3.6.1.2.1.1.3.0 + +~~~ +8:~$ snmpget -v 1 -c public routeur .1.3.6.1.2.1.1.3.0 +DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (88640) 0:14:46.40 +8:~$ snmpget -v 1 -c public routeur system.sysUpTime.0 +DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (102902) 0:17:09.02 +8:~$ snmpget -v 1 -c public routeur .iso.org.dod.internet.mgmt.mib-2.system.sysUpTime.0 +DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (107510) 0:17:55.10 +~~~ + +Affichage des OID system : +~~~ +$ snmptranslate -Tp -IR system +~~~ + +Lister les interfaces : +~~~ +8:~$ snmpwalk -OX -c public -v 1 routeur .1.3.6.1.2.1.2 +~~~ + +Lister les variables system : +~~~ +8:~$ snmpwalk -v 1 -c public routeur system +~~~ + +Lister les disques : +~~~ +snmpwalk -v 1 -c public routeur .1.3.6.1.4.1.2021.9 +~~~ + +Lister load : + +~~~ +8:~$ snmpwalk -v 1 -c public routeur .1.3.6.1.4.1.2021.10 +~~~ + +SNMPv2-SMI::enterprises = .1.3.6.1.4.1 + + +Lister toutes les variables : +~~~ +8:~$ snmpwalk -v 1 -c public .1 +~~~ + +## Intégration à Nagios + +Le plugin `check_snmp` de Nagios permet de réaliser des requêtes SNMP et d'interpréter le résultat comme étant _OK_, _Warning_ ou _Critical_. + +### Utilisation + +Les paramètres les plus utiles du plugin sont : + +* `-H` : machine à surveiller ; +* `-P` : version du protocole à utiliser (1, 2c ou 3) ; +* `-o` : OID sur lequel vers la requête ; +* `-u` : unité de la valeur de l'OID (utilisé comme suffixe) ; + +Définitions des seuils : + +* `-w` : plage de valeur du résultat (sous la forme `"x:y"`) qui ne sera pas considéré comme un _Warning_ (Les valeurs x et y sont compris dans la plage) ; +* `-c` : idem, mais pour le _Critical_ ; + +Exemple : +~~~ +/usr/lib/nagios/plugins/check_snmp -H san -P 2c -o 1.3.6.1.4.1.1714.1.2.1.11.1 -u "failed hard drive" -w "0:0" -c"0:1" +~~~ + +Dans ce cas, le résultat de la requête sera considéré comme _OK_ si il vaut _0_, _Warning_ si il vaut _1_, et _Critical_ si il est supérieur à _1_. diff --git a/HowtoSQLite.md b/HowtoSQLite.md new file mode 100644 index 00000000..a50a376a --- /dev/null +++ b/HowtoSQLite.md @@ -0,0 +1,21 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Howto SQLite + + + +~~~ +$ sqlite3 coin.db +sqlite>-- Voir les tables +sqlite>.tables +sqlite>-- Schema d'une table +sqlite> .schema +sqlite>-- On peut utiliser les commandes SQL : select, update, etc. +sqlite> select * from
+1|0|1|0 +sqlite>-- Supprimer une ligne +sqlite> delete from
where = +sqlite>-- Sortir +sqlite>.exit +~~~ + diff --git a/HowtoSSH.md b/HowtoSSH.md new file mode 100644 index 00000000..c5f46987 --- /dev/null +++ b/HowtoSSH.md @@ -0,0 +1,113 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto SSH : Secure SHell + +## Administration SSH + +Obtenir l'empreinte de la clé publique (RSA) du serveur : +~~~ +$ ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub +~~~ + +De même pour la clé DSA : +~~~ +$ ssh-keygen -lf /etc/ssh/ssh_host_dsa_key.pub +~~~ + +Regénérer les clés RSA/DSA du serveur (exemple sous Debian) : +~~~ +# mv /etc/ssh/{moduli,*key*} /tmp/ssh/ +# dpkg-reconfigure openssh-server +Creating SSH2 RSA key; this may take some time ... +Creating SSH2 DSA key; this may take some time ... +Restarting OpenBSD Secure Shell server: sshd. +~~~ + +Recharger le démon _sshd_ sous Debian sans utiliser le script init.d : + +~~~ +# start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile /var/run/sshd.pid --exec /usr/sbin/sshd +~~~ + +Redémarrer le démon _sshd_ sous Debian sans utiliser le script init.d : + +~~~ +# start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile /var/run/sshd.pid +# start-stop-daemon --start --quiet --pidfile /var/run/sshd.pid --exec /usr/sbin/sshd +~~~ + +Recharger le démon _sshd_ sous OpenBSD : + +~~~ +# kill -HUP `cat /var/run/sshd.pid` +~~~ + +## SFTP chroot + +Voici un ensemble de commandes pouvant être utilisées pour mettre en place un accès SFTP pour un ou plusieurs utilisateurs, qui n'auront accès qu'à une vue limitée de l'arborescence du système : + +~~~ +# Répertoire dans lequel SSHD va se chrooter +mkdir /home/sftp +chmod 755 /home/sftp + +# Les utilisateurs du groupe sftp (ici account1) disposeront de l'accès SFTP restreint +groupadd sftp +useradd -g sftp -d /account1 account1 +mkdir /home/sftp/account1/ +chown account1:sftp /home/sftp/account1/ +chmod 700 /home/sftp/account1/ +~~~ + +Dans le fichier /etc/ssh/sshd_config : + +~~~ +Subsystem sftp internal-sftp + +Match group sftp + ChrootDirectory /home/sftp + X11Forwarding no + AllowTcpForwarding no + ForceCommand internal-sftp +~~~ + +## Clé SSH + +Pour autoriser une clé SSH en limitant les accès via _.ssh/authorized_keys_ : + +~~~ +no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa XXXXX commentaires +~~~ + +## SFTP Only + +Mettre shell /usr/lib/sftp-server pour l'utilisateur et s'assurer que ce shell est bien présent dans /etc/shells +~~~ +# usermod -s /usr/lib/sftp-server userna +# echo '/usr/lib/stfp-server' >> /etc/shells +~~~ + +## VPN over SSH + +Côté serveur SSH : + +- Ajouter "PermitTunnel yes" dans la config ssh +- sysctl -w net.ipv4.ip_forward=1 +- iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE + +Puis se connecter de root vers root : + +~~~ +# ssh -w 42:42 ssh.example.com +~~~ + +On a ensuite un périphérique "tun42" utilisable des 2 côtés à configurer. + +Serveur SSH : ifconfig tun42 172.17.18.2/24 +En local : ifconfig tun42 172.17.18.1/24 + +On peut alors router au niveau IP : + +ip route add 8.8.8.8/32 via 172.17.18.2 dev tun42 + + diff --git a/HowtoSVN.md b/HowtoSVN.md new file mode 100644 index 00000000..06864868 --- /dev/null +++ b/HowtoSVN.md @@ -0,0 +1,138 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto SVN + +## Procédure de mise en place d'un dépôt + +On crée le répertoire qui contiendra les dépôts SVN : +~~~ +mkdir /home/svn/ +~~~ + +On crée également un groupe _svn_ qui contiendra les utilisateurs qui auront le droits d'accéder au dépôt : +~~~ +addgroup -q svn +~~~ + +On peut ensuite créer un premier dépôt nommé _foo_ : +~~~ +svnadmin create /home/svn/foo +~~~ + +Il est maintenant nécessaire d'adapter les droits : +~~~ +chgrp -R svn /home/svn/ +chmod 750 /home/svn/ + +chmod -R g+rwX /home/svn/foo/ +chmod -R g+s /home/svn/foo/db/ +~~~ + +Enfin, on peut ajouter les utilisateurs ayant accès au svn dans le groupe svn : +~~~ +adduser -q jdoe svn +~~~ + +Il est nécessaire que leur umask soit positionné à la valeur 007, on l'indiquant par exemple dans leur ~/.profile. +~~~ +echo umask 007 >> ~jdoe/.profile +~~~ + +## Authentification sans compte UNIX + +Éditer le fichier svnserve.conf à votre convenance, typiquement, droits d'écriture en anonyme ou pas, etc. Mais surtout, indiquez le fait qu'on utilise une base de données des utilisateurs et mot de passes dans un fichier passwd. + +~~~ +[general] +anon-access = none +auth-access = write +password-db = passwd +realm = Nom du repo +~~~ + +Ajouter les utilisateurs et leur mot de passes dans le fichier conf/passwd : +~~~ + +[users] +# harry = harryssecret +# sally = sallyssecret +toto = tata +~~~ + +## SVN+HTTP + +Installation et activation des modules requis : +~~~ +# aptitude install libapache2-svn +# a2enmod dav_svn +~~~ + +Configuration du VHost : +~~~ + + DAV svn + SVNParentPath /home/svn + AuthType Basic + AuthName "SVN" + AuthUserFile /home/svn/.htpasswd + AuthzSVNAccessFILE /home/svn/.authz + Require valid-user + Allow from all + +~~~ + +Dans le cas de plusieurs dépôts, on vérifiera de bien utiliser la directive "SVNParentPath". +Pour un seul dépôt, la directive "SVNPath" peut être utilisée, et dans ce cas doit pointer directement sur le dépôt en question. + +## SVN+HTTP et authentification LDAP + +Même pré-requis que précédemment, avec en plus : +~~~ +# a2enmod authnz_ldap +~~~ + +Et la configuration suivante : +~~~ + + DAV svn + SVNParentPath /home/svn + AuthType Basic + AuthName "SVN" + AuthBasicProvider ldap + AuthzLDAPAuthoritative on + AuthLDAPURL "ldap://127.0.0.1:389/dc=example,dc=com?uid?sub?(objectClass=*)" + AuthLDAPGroupAttribute memberUid # Chercher l'attribut memberUid au lieu de uniqueMember + AuthLDAPGroupAttributeIsDN off # Ne pas chercher un DN complet (uid=user,dc=example,dc=com) dans l'attribut memberUid mais uniquement l'uid + Require ldap-group cn=svn,ou=group,dc=example,dc=com + Allow from all + +~~~ + +## FAQ + +Lorsque l'on obtient un message du type : +~~~ +$ svn checkout svn+ssh://SERVEUR/svn/sendsms2mobyt +svn: Erreur de base Berkeley pour le système de fichiers '/svn/sendsms2mobyt/db' en ouvrant l'environnement : + +svn: DB_VERSION_MISMATCH: Database environment version mismatch +svn: bdb: Program version 4.6 doesn't match environment version 4.4 +~~~ +... c'est que la version du dépôt est obsolète. Il faut la mettre à jour sur le serveur SVN : +~~~ +$ svnadmin recover sendsms2mobyt/ +Verrou du dépôt acquis. +Patientez; le rétablissement du dépôt peut être long... + +Fin du rétablissement. +La dernière révision du dépôt est 12 +~~~ + +Si l'on veut commiter en svn+ssh:// avec un login différent du checkout : + +On peut forcer l'utiliser via le $HOME/subversion/config +~~~ +[tunnels] +ssh = $SVN_SSH ssh -l +~~~ + diff --git a/HowtoSamba.md b/HowtoSamba.md new file mode 100644 index 00000000..f695fd56 --- /dev/null +++ b/HowtoSamba.md @@ -0,0 +1,265 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Samba + +## Installation + +~~~ +# aptitude install samba +~~~ + +TODO... + +## Configuration + +Attention : la configuration est rechargée *automatiquement* toutes les 60s ...ce qui est pratique mais peut avoir des effets indésirables ! + +/etc/samba/smb.conf + +## Installer un BDC (Backup Domain Controler) + + + + + +1. Configurer une réplication LDAP master -> slave (note: s'assurer que les attributs de mot de passe sont bien synchroniser) + +2. Configurer *smb.conf* sur le BDC ainsi : + +~~~ +passdb backend = ldapsam:ldap://127.0.0.1 +domain master = no +domain logons = yes +~~~ + +3. Sur le BDC, bien penser à également positionner le mot de passe LDAP : smbpasswd -W + +4. Joindre le BDC au domaine via : + +~~~ +# net rpc join -S PDC -Uadmin +Enter admin's password: +Joined domain DOMAIN. +~~~ + +Attention, il peut être nécessaire de répéter l'opération 2 fois (bien s'assurer que la machine bdc$ a été créée entre temps). + +5. Forcer le SID du BDC : + +~~~ +# net rpc getsid -S PDC +Storing SID S-1-5-21-123-456-789 for Domain DOMAIN in secrets.tdb +# net setlocalsid S-1-5-21-123-456-789 +# /etc/init.d/samba stop && /etc/init.d/samba start +~~~ + +## Intégration des postes + +Note importante : pour joindre un poste à un domaine Microsoft, il faut impérativement +qu'il ait une version Pro (pas de version Familiale !) : Windows XP Pro ou Windows Seven Pro. + +### Windows XP Pro + + + +### Windows Seven Pro + +Procédure dispo ici : + +### Windows 10 + +ça marche, en changeant les mêmes clés de registre que sous Windows 7, cf + +## Tester la conexion + +Les test vont se faire avec la commande smbclient : +~~~ +apt install smbclient +~~~ + +Lister les partages : +~~~ +smbclient -L localhost -U username +~~~ + +Se connecter a un partage : +~~~ +smbclient //localhost/partage -U username +~~~ + +## FAQ + +### NT_STATUS_ACCESS_DENIED lors de la jonction à un domaine + +Si vous avez quelque chose ressemblant à ceci : + +~~~ +[2012/01/24 17:24:17.352908, 4] smbd/reply.c:786(reply_tcon_and_X) Client requested device type [?????] for share [IPC$] +[2012/01/24 17:24:17.352943, 3] lib/access.c:389(check_access) check_access: no hostnames in host allow/deny list. +[2012/01/24 17:24:17.353015, 2] lib/access.c:406(check_access) Allowed connection from (192.168.0.111) +[2012/01/24 17:24:17.353510, 4] passdb/pdb_ldap.c:1601(ldapsam_getsampwnam) ldapsam_getsampwnam: Unable to locate user [root] count=0 +[2012/01/24 17:24:17.353856, 2] smbd/service.c:598(create_connection_server_info) user 'myadmin' (from session setup) not permitted to access this share (ipc$) +create_connection_server_info failed: NT_STATUS_ACCESS_DENIED +[2012/01/24 17:24:17.353891, 3] smbd/error.c:80(error_packet_set) +error packet at smbd/reply.c(795) cmd=117 (SMBtconX) NT_STATUS_ACCESS_DENIED +~~~ + +Alors il est très probable que cela soit du à : + +~~~ +invalid users = root +~~~ + +### Expiration d'un compte + +Expiration d'un compte (avec smbldap-tools) : smbldap-usermod -e YYYY-MM-DD + +Forcer le changement de mot de passe : _smbldap-usermod -B 1 _ + +### Mise en place d'une « corbeille » sur un partage réseau + +Il est possible de faire en sorte que les fichiers supprimés par les utilisateurs sur un partage soient déplacés dans un répertoire spécifique, +de sorte qu'ils puissent les récupérer en cas d'erreur. Cela se fait avec le module _recycle_ de Samba. + +Exemple de configartion (à rajouter dans chacun des partages si besoin) : + +~~~ +vfs object = recycle + recycle:repository = .trash/%U + recycle:keeptree = Yes + recycle:touch = Yes + recycle:versions = Yes + recycle:maxsixe = 0 + #recycle:exclude = *.tmp + #recycle:exclude_dir = /tmp +~~~ + +Les fichiers supprimés seront déplacés dans le répertoire _.trash_ relatif au partage, et rangés dans un répertoire au nom de l'utilisateur qui l'a supprimé. +Si le fichier existe déjà, une copie est fait en _Copy #x of filename_ (grâce à l'option _recycle:versions_). + +Pour plus d'informations sur les options possible : + +Les fichiers conservés ne sont pas limités dans le temps. Pour cela on pourra mettre un cron qui nettoiera le répertoire concerné : +~~~ +32 4 * * * find /home/samba/foo/.trash/ -type f -atime +7 -delete +~~~ + +Bien s'assurer dans ce cas que l'option _recycle:touch_ est active pour que la date d'accès soit mise à jour lors du déplacement du fichier. + +### Synchronisation des mots de passe Unix vers Samba + +Le but ici est de faire en sorte que lors d'un changement de mot de passe avec la commande `passwd`, le changement soit aussi appliqué sur le mot de passe Samba. + +* Installation du module PAM nécessaire : +~~~ +# aptitude install libpam-smbpass +~~~ + +* Ajout du module dans le fichier _/etc/pam.d/common-password_ : +~~~ +password required pam_smbpass.so nullok use_authtok try_first_pass +~~~ +Il faut aussi modifier dans le même fichier la ligne concernant le module pam_ldap (ou pam_unix si LDAP n'est pas utilisé) pour passer _required_ à _requisite_ (force à se terminer à la première erreur, pour éviter que les 2 mots de passe ne soient désynchronisés) : +~~~ +#password required pam_ldap.so use_first_pass +password requisite pam_ldap.so use_first_pass +~~~ + +* Ajout du module dans le fichier _/etc/pam.d/common-auth_ : +~~~ +auth optional pam_smbpass.so migrate +~~~ + +Note : pour que l'utilisateur puisse changer son mot de passe, il faut que les 2 mots de passe soient déjà synchronisés. + +### Import des comptes d'un fichier smbpasswd vers la db interne à Samba (passdb.tdb) + +~~~ +# pdbedit -i smbpasswd +~~~ + +### Forcer un changement de mot de passe utilisateur + +Pour qu'un utilisateur soit invité à changer son mot de passe à la prochaine connexion, il faut forcer l'attribut _sambaPwdMustChange_ à _0_. À partir de Samba 3.2, cela ne suffit plus, et il faut également définir _sambaPwdLastSet_ à _0_. + +L'utilisateur serra averti par un message Windows comme quoi son mot de passe expire aujourd'hui, mais il aura toujours la possibilité de refuser de le changer et de reporter le changement indéfiniment. +Pour éviter cela, il faut retirer le flag _X_ du champs _sambaAcctFlags_, pour réellement faire expirer le mot de passe. + +Au final, ça donne : +~~~ +sambaPwdLastSet: 0 +sambaPwdMustChange: 0 +sambaAcctFlags: [U ] +~~~ + + +### Erreur Rejecting auth request from client CLIENT machine account CLIENT$ + +Windows gère des "credentials machine" c'est-à-dire une sorte de mot de passe associé à la machine. +Tous les 30 jours (au moins), il le renouvelle et doit donc transmettre son nouveau mot de passe à Samba (il est inscrit dans LDAP dans l'attribut "sambaNTPassword" de l'entrée machine CLIENT$). +Si il y a un souci de synchronisation (erreur réseau au démarrage, erreur temporaire, etc.) il peut être nécessaire de réinitialiser ces infos. +Deux possibilités : +- supprimer les attributs sambaNTPassword et sambaPwdLastSet associées à MACHINE$ et redémarrer la machine +- sortir la machine du domaine, effacer l'entrée LDAP associée à la machine, et rentrer à nouveau la machine dans le domaine + +Note : si besoin (mais c'est moins sécurisé...), il est possible de désactiver ce renouvellement de mot de passe machine via une clé de registre : +~~~ +Client-Registry: [HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters] "DisablePasswordChange"=dword:00000001 +~~~ + + +# Installation et Configuration de Samba sans LDAP + + +## Installation + +~~~ +aptitude install samba +~~~ + +Sur Debian 6 Squeeze il est nécessaire d'installer aussi les paquets suivants: + +~~~ +aptitude install samba-common samba-tools +~~~ + + +## Configuration +La configuration du serveur se fait dans le fichier */etc/samba/smb.conf*: + +~~~ +[global] + workgroup = Nom_du_groupe + netbios name = Nom_du_serveur + security = user + interfaces = eth0 + syslog = 0 + log file = /var/log/samba/log.%m + log level = 1 + max log size = 1000 + +[NOM_DU_PARTAGE] + path = /home/chemin_du_dossier + valid users = nom_du_user_samba + create mask = 0777 + force create mode = 0777 + directory mask = 0777 + force directory mode = 0777 + browseable = yes + comment = Commentaire_sur_le_partage + writable = yes + write list = liste_des_users_autorisé + +~~~ + + +## Ajout d'un utilisateur Samba +L'ajout d'un utilisateur Samba se fait avec la commande suivante: + +~~~ +smbpasswd -a nom_de_l'utilisateur +~~~ + +Un mot de passe pour cet utilisateur est demandé, l’utilisateur crée doit déjà exister en tant que utilisateur UNIX. + + diff --git a/HowtoSfdisk.md b/HowtoSfdisk.md new file mode 100644 index 00000000..50e07621 --- /dev/null +++ b/HowtoSfdisk.md @@ -0,0 +1,53 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto sfdisk + +Dumper une table de partitions : + +~~~ +# sfdisk -d /dev/sdz > partitions +~~~ + +Restaurer une table de partitions : + +~~~ +# sfdisk /dev/sdz < partitions +~~~ + +Si le disque est en cours d'utilisation mais que l'on a même pas peur : + +~~~ +# sfdisk --force /dev/sdz < partitions +~~~ + +## Redimensionner une partition avec sfdisk + +sfdisk est pratique car il gère directement les secteurs : secteur de début et taille des partitions en secteur. + +0. Par précaution, on démonte la partition ciblée et on dump le volume actuel + +~~~ +# sfdisk -d /dev/sdz > partitions.veryold +~~~ + + +1. Bien noter de combien de secteurs on augmente le volume : + on pourra notamment comparer le nombre de secteurs du volume (avec fidsk par exemple) + avant augmentation, puis après augmentation. Notons une augmentation de N secteurs. + +2. On dumpe la partition + +~~~ +# sfdisk -d /dev/sdz > partitions +# cp partitions partitions.new +~~~ + +3. On édite le fichier partitions.new, en ajoutant +N à la dernière partition ET - si besoin - à la partition extended correspondant + +4. On réinjecte et on resize : + +~~~ +# sfdisk /dev/sdz < partitions.new +# resize2fs /dev/sdz8 +~~~ + diff --git a/HowtoShareDance.md b/HowtoShareDance.md new file mode 100644 index 00000000..5b5347ef --- /dev/null +++ b/HowtoShareDance.md @@ -0,0 +1,212 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Sharedance + +Sharedance est un logiciel très simple conçu pour stocker des sessions en mémoire. +Il est notamment utilisé sur les [Skyblogs](http://www.skyrock.com/blog/) +Il n'est plus maintenu depuis 2006 mais vu sa simplicité, son utilisation peut encore être envisagée. + + + +## Installation + +~~~ +$ wget +$ tar xvf sharedance-0.6.tar.gz +$ cd sharedance-0.6 +$ ./configure +$ make +# make install +~~~ + +Il peut être lancé ainsi : + +~~~ +# /usr/sbin/sharedanced --uid=65534 --gid=65534 --directory=/var/tmp --daemonize --expiration=10800 +~~~ + +Son utilisation avec PHP se fait ainsi dans le fichier _php.ini_ : +~~~ +auto_prepend_file = /usr/local/etc/sharedance.php +;session.save_handler = user +;session.save_handler = files +~~~ + +avec un fichier _sharedance.php_ du type : + +~~~ +> 24) & 0xff, ($key_len >> 16) & 0xff, + ($key_len >> 8) & 0xff, $key_len & 0xff, + ($data_len >> 24) & 0xff, ($data_len >> 16) & 0xff, + ($data_len >> 8) & 0xff, $data_len & 0xff); + $s .= $key; + $s .= $data; + fwrite($GLOBAL_SHAREDANCE_FP, $s); + if (@fgets($GLOBAL_SHAREDANCE_FP) !== "OK\n") { + sharedance_close(); + return -1; + } + sharedance_close(); + + return 0; + +function sharedance_fetch($key) +{ + global $GLOBAL_SHAREDANCE_FP; + + if (sharedance_reopen() !== 0) { + return -1; + } + $key_len = strlen($key); + $s = sprintf('F%c%c%c%c', + ($key_len >> 24) & 0xff, ($key_len >> 16) & 0xff, + ($key_len >> 8) & 0xff, $key_len & 0xff); + $s .= $key; + stream_set_blocking($GLOBAL_SHAREDANCE_FP, 0); + fwrite($GLOBAL_SHAREDANCE_FP, $s); + stream_set_blocking($GLOBAL_SHAREDANCE_FP, 1); + $data = ''; + while (($tmp = @fread($GLOBAL_SHAREDANCE_FP, 4096)) != FALSE) { + $data .= $tmp; + } + sharedance_close(); + if ($data === '') { + return FALSE; + } + return $data; +} + +function sharedance_delete($key) +{ + global $GLOBAL_SHAREDANCE_FP; + + if (sharedance_reopen() !== 0) { + return -1; + } + $key_len = strlen($key); + $s = sprintf('D%c%c%c%c', + ($key_len >> 24) & 0xff, ($key_len >> 16) & 0xff, + ($key_len >> 8) & 0xff, $key_len & 0xff); + $s .= $key; + stream_set_blocking($GLOBAL_SHAREDANCE_FP, 0); + fwrite($GLOBAL_SHAREDANCE_FP, $s); + stream_set_blocking($GLOBAL_SHAREDANCE_FP, 1); + if (@fgets($GLOBAL_SHAREDANCE_FP) !== "OK\n") { + sharedance_close(); + return -1; + } + sharedance_close(); + + return 0; +} + +function session_handler_open($save_path, $session_name) +{ + if (sharedance_open(SESSION_HANDLER_HOST) !== 0) { + return FALSE; + } + return TRUE; +} + +function session_handler_close() { + sharedance_close(); + + return TRUE; +} + +function session_handler_store($key, $data) { + if (sharedance_store($key, $data) !== 0) { + return FALSE; + } + return TRUE; +} + +function session_handler_fetch($key) { + return sharedance_fetch($key); +} + +function session_handler_delete($key) { + if (sharedance_delete($key) !== 0) { + return FALSE; + } + return TRUE; +} + +function session_handler_gc($timeout) { + return TRUE; +} + +session_set_save_handler('session_handler_open', 'session_handler_close', + 'session_handler_fetch', 'session_handler_store', + 'session_handler_delete', 'session_handler_gc'); + +?> +~~~ \ No newline at end of file diff --git a/HowtoShell.md b/HowtoShell.md new file mode 100644 index 00000000..ba340059 --- /dev/null +++ b/HowtoShell.md @@ -0,0 +1,41 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +### Générer des caractères alphanumériques aléatoires et lisibles + +~~~ +$ false; while [ $? != 0 ]; do apg -c /dev/urandom -n1 -E oOlL10 | egrep '^[[:alnum:]]+$'; done +~~~ + +### Débloquer une connexion SSH gelée + +Faire la séquence suivante sur votre clavier : Entrée + ~ + . (Entrée puis tilde, puis point.) + +### Lister l'environnement d'un processus + +~~~ +$ cat /proc/_pid_/environ +~~~ + +On peut aussi créer un petit script dans _/usr/local/bin/pidenv_ + +~~~ +#!/bin/sh + +pid="$1" +tr '\000' '\n' < /proc/$pid/environ +~~~ + +Et ainsi disposer d'un formattage plus lisible : + +~~~ +# pidenv 1 +SHLVL=1 +HOME=/ +init=/sbin/init +TERM=linux +drop_caps= +BOOT_IMAGE=/vmlinuz-4.6.0-0.bpo.1-amd64 +PATH=/sbin:/usr/sbin:/bin:/usr/bin +PWD=/ +rootmnt=/root +~~~ \ No newline at end of file diff --git a/HowtoShorewall.md b/HowtoShorewall.md new file mode 100644 index 00000000..e76770e5 --- /dev/null +++ b/HowtoShorewall.md @@ -0,0 +1,78 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Shorewall + +Ajouter une autorisation se fait dans le fichier _/etc/shorewall/rules_ + +Pour relancer le firewall : + +~~~ +# shorewall safe-restart +Compiling... +Initializing... +Determining Zones... + IPv4 Zones: net + Firewall Zone: fw +Validating interfaces file... +Validating hosts file... +Pre-processing Actions... + Pre-processing /usr/share/shorewall/action.Drop... + Pre-processing /usr/share/shorewall/action.Reject... +Validating Policy file... +Determining Hosts in Zones... + net Zone: eth0:0.0.0.0/0 +Deleting user chains... +Compiling /etc/shorewall/routestopped ... +Creating Interface Chains... +Compiling Common Rules +Adding Anti-smurf Rules +Adding rules for DHCP +Enabling RFC1918 Filtering +Compiling TCP Flags checking... +Compiling Kernel Route Filtering... +Compiling Martian Logging... +Compiling /etc/shorewall/rules... +Compiling Actions... +Compiling /usr/share/shorewall/action.Drop for Chain Drop... +Compiling /usr/share/shorewall/action.Reject for Chain Reject... +Compiling /etc/shorewall/policy... +Compiling Traffic Control Rules... +Compiling Rule Activation... +Compiling IP Forwarding... +Shorewall configuration compiled to /var/lib/shorewall/.restart + Dynamic Rules Saved + Currently-running Configuration Saved to /var/lib/shorewall/.safe +Restarting... +Restarting Shorewall.... +Initializing... +Clearing Traffic Control/QOS +Deleting user chains... +Enabling Loopback and DNS Lookups +Setting up dynamic rules... +Creating Interface Chains... +Setting up SMURF control... +Setting up Black List... +Adding Anti-smurf Jumps... +Setting up rules for DHCP... +Setting up RFC1918 Filtering... +Setting up TCP Flags checking... +Setting up ARP filtering... +Setting up Route Filtering... +Setting up Martian Logging... +Setting up Accept Source Routing... +Setting up SYN Flood Protection... +Setting up Rules... +Setting up Actions... +Creating action chain Drop +Creating action chain Reject +Creating action chain dropBcast +Creating action chain dropInvalid +Creating action chain dropNotSyn +Applying Policies... +Activating Rules... +IP Forwarding Enabled +done. +Do you want to accept the new firewall configuration? [y/n] y +New configuration has been accepted +~~~ + diff --git a/HowtoSmokeping.md b/HowtoSmokeping.md new file mode 100644 index 00000000..35f002e4 --- /dev/null +++ b/HowtoSmokeping.md @@ -0,0 +1,65 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Smokeping + +## Installation + +~~~ +# aptitude install smokeping +~~~ +Normalement il est aussi installé _speedy-cgi-perl_ pour la gestion des cgi par apache. +À partir de maintenant smokeping est accessible sur + +Si cela ne fonctionne pas vérifier que vous avez dans le vhost par défaut. + +~~~ +ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ + AllowOverride None + Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch + Order allow,deny + Allow from all +~~~ + +## Configuration + +### Mise en place d'alerte mail + +Éditer le fichier `/etc/smokeping/config.d/alerts` et spécifier les bonnes informations : + +~~~ +*** Alerts *** +to = tech@evolix.net +from = smokealert@smokeping.evolix.net +~~~ + +Dans la suite du fichier de configuration se trouve les types d'alertes, exemple : + +~~~ ++bigloss +type = loss +pattern = <100%,>50%,>50% +comment = host not responding +~~~ + +Permet de détecter quand un hôte ne ping plus du tout. + +Vous pouvez ensuite dire à Smokeping d'envoyer une alerte en ajoutant l'alerte dans la liste des _Targets_ voulus. +~~~ +# vim /etc/smokeping/config.d/Targets ++ EvolixLAN +menu = Evolix LAN +title = LAN d'evolix +alerts = bigloss + +++ optiplex +host = optiplex.evolix.net + +++sc420 +host = sc420.evolix.net + +++routeur +host = routeur.evolix.net +~~~ + + + diff --git a/HowtoSolr.md b/HowtoSolr.md new file mode 100644 index 00000000..f1be197e --- /dev/null +++ b/HowtoSolr.md @@ -0,0 +1,64 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Solr + + + + + +## Installation + +On installe Java 6 / Tomcat 6 via [wiki:HowtoTomcat] + +On installe le paquet 'solr-tomcat' depuis Debian Sid : + +~~~ +# aptitude install solr-tomcat +~~~ + +## Configuration + +Par défaut, les données sont dans */var/lib/solr*. +Si l'on souhaite les stocker ailleurs (par exemple _/srv/solr_), on gèrera un lien symbolique : +`var/lib/solr -> /srv/solr` + +La configuration se trouve dans le répertoire _/etc/solr/_ + +## Instances + +Pour lancer plusieurs instances de Solr dans le même tomcat, il "suffit" de dupliquer la configuration dans /etc/tomcat6/Catalina/localhost/ avec un répertoire de configuration distinct : + +~~~ +# cat /etc/tomcat6/Catalina/localhost/solr-1.xml + + + + +# cat /etc/tomcat6/Catalina/localhost/solr-2.xml + + + + +~~~ + +Et de dupliquer le répertoire "conf" dans /etc/solr//. + +~~~ +# ls -l /etc/solr/* +/etc/solr/solr-1: +total 4 +drwx------ 5 tomcat6 tomcat6 4096 Apr 19 15:28 conf + +/etc/solr/solr-2: +total 4 +drwx------ 5 tomcat6 tomcat6 4096 Apr 19 15:28 conf +~~~ + +## Trop de logs ? + +Si c'est trop verbeux dans catalina.out (ou catalina.date.log), il faut changer le niveau de verbosité dans son interface d'admin. Exemple avec un tunnel : + +~~~ +ssh -L 8080::8080 unemachine-solr +~~~ + diff --git a/HowtoSquid/Proxy.md b/HowtoSquid/Proxy.md new file mode 100644 index 00000000..7239f727 --- /dev/null +++ b/HowtoSquid/Proxy.md @@ -0,0 +1,208 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto proxy avec Squid + +On peut donc installer Squid pour faire office de proxy HTTP/HTTPS. +Voici un exemple de configuration : + +~~~ +# System +########## + +# Squid normally listens to port 3128 +# 3128 + 3128 transparent + +# By default, ICP queries are disabled +#icp_port 0 + +# Boost max FD (TODO : need ulimit ?) +max_filedescriptors 4096 + +# Logs +#emulate_ on +logformat combined %>a %[ui %[un [%tl] "%rm %ru HTTP/%rv" %>Hs %h" "%{User-Agent}>h" %Ss:%Sh +access_log /var/log/squid3/access.log combined +#cache_log /var/log/squid3/cache.log +cache_store_log /var/log/squid3/store.log +#debug_options ALL,3 + +visible_hostname proxy.example.com + +# Hint : custom error pages +# cp -r fr custom +# +error_directory /usr/share/squid3/errors/custom +email_err_data on +#err_html_text + +cache_mgr proxy@example.com + +# Cache +############# + +# Don't cache errors +negative_ttl 0 +acl badreq 400 +cache deny badreq + +# Gestion du cache +refresh_pattern ^ftp: 1440 20% 10080 +refresh_pattern ^gopher: 1440 0% 1440 +refresh_pattern . 0 20% 4320 + +hierarchy_stoplist cgi-bin ? +acl QUERY urlpath_regex cgi-bin \? +cache deny QUERY + +coredump_dir /var/spool/squid3 +cache_dir ufs /var/spool/squid3 800 16 256 +cache_mem 128 MB +maximum_object_size_in_memory 512 KB +maximum_object_size 64 MB + +# ACL +############## +# + +#acl all src 0.0.0.0/0 +acl localhost src 127.0.0.0/8 +acl localnet src 192.168.0.0/16 + +acl SSL_ports port 443 + +acl Safe_ports port 80 +acl Safe_ports port 443 + +acl purge method PURGE +acl CONNECT method CONNECT + +acl manager proto cache_object + +acl ExceptionIpList src "/etc/squid3/exceptioniplist.conf" +acl ExceptionSiteList dstdom_regex "/etc/squid3/exceptionsitelist.conf" +acl BannedDestination dstdom_regex "/etc/squid3/banneddestination.conf" +acl BannedURL urlpath_regex "/etc/squid3/bannedURL.conf" + +acl allowed_sites dstdomain .squid-cache.org +acl allowed_sites dstdomain .evolix.net + +acl nocache_sites dstdomain .evolix.fr +acl nocache_sites dstdomain .evolix.com + +# Deny requests to certain unsafe ports + deny !Safe_ports + +# Deny CONNECT to other than secure SSL ports + deny CONNECT !SSL_ports + +# admin + allow manager localhost + deny manager + allow purge localhost + deny purge + + allow allowed_sites + +cache deny nocache_sites + allow nocache_sites + + allow ExceptionSiteList + deny BannedDestination + deny BannedURL + deny ExceptionIpList + allow localnet + + deny all + +### # rate limiting +### #################### +### # +### # +### +### delay_pools 3 +### +### # Debit non limite +### delay_class 1 2 +### delay_parameters 1 -1/-1 -1/-1 +### +### # Debit limite a 8000 bytes/s, soit 64 Kbps par poste +### delay_class 2 2 +### delay_parameters 2 -1/-1 8000/8000 +### +### # Debit global limite a 120000 bytes/s, soit 960 Kbit/s +### # Debit postes limite a 40000 bytes/s, soit 320 Kbit/s +### delay_class 3 2 +### delay_parameters 3 120000/120000 40000/40000 +### +### #delay_access 1 deny all +### #delay_access 2 deny all +### #delay_access 3 allow localnet +~~~ + +Créer les backlist et whitelist (vides) : + +~~~ +# cd /etc/squid3/ +# for i in banneddestination.conf bannedURL.conf exceptioniplist.conf exceptionsitelist.conf; do touch $i; done +~~~ + +banneddestination.conf : Liste de sites bloqués, vous pouvez utiliser votre propre liste noire ou en récupérer une communautaire ou commerciale. Exemple : + +~~~ +^(.*\.)?007guard.com$ +^(.*\.)?008i.com$ +^(.*\.)?008k.com$ +~~~ + +bannedURL.conf : Liste d'URLs bloqués, toute partie après le nom de domaine. +exceptioniplist.conf : Liste d'adresses IP à passer en mode blacklist. Par défaut on est en mode whitelist. +exceptionsitelist.conf : Sites autorisés pour le mode whitelist. + +Configurer les pages d'erreurs en copiant le modèle Français. (Et éventuellement faire des modifications). + +~~~ +# cd /usr/share/squid3/errors +# cp -r fr custom +~~~ + + +## Blacklists + + + (payant) + + (payant) + (obsolète) + +## Ne pas cacher + +Voici un exemple d'entête pour forcer un proxy à ne jamais cacher : + +~~~ +Cache-Control: max-age=0, no-cache, no-store, must-revalidate +Pragma: no-cache +Expires: Thu, 01 Jan 1970 00:00:42 GMT +~~~ + +Sur un serveur web Apache, on peut ainsi mettre en place un fichier .htaccess du type : + +~~~ + +FileETag None + +Header unset ETag +Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" +Header set Pragma "no-cache" +Header set Expires "Thu, 01 Jan 1970 00:00:42 GMT" + + +~~~ + +En PHP, on pourra ainsi écrire le code suivant : + +~~~ +header("Pragma: no-cache"); +header("Cache-Control: max-age=0, no-cache, no-store, must-revalidate"); +header("Expires: Thu, 01 Jan 1970 00:00:42 GMT"); +~~~ diff --git a/HowtoSquid/ReverseProxy.md b/HowtoSquid/ReverseProxy.md new file mode 100644 index 00000000..f4a161a2 --- /dev/null +++ b/HowtoSquid/ReverseProxy.md @@ -0,0 +1,128 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Reverse Proxy avec Squid + +[wiki:HowtoSquid Squid] peut être utilisé comme un puissant _reverse proxy_ permettant une mise en cache de contenu avec de grandes performances.[[BR]] +Son utilisation en amont d'un load-balancer comme [wiki:HowtoHaproxy HAProxy] s'utilise dans les infrastructures haute-disponibilité. + + +~~~ + _________port 80: Frontal 1 + / +Clients ---> port 80: Squid ---> port 8080: HAProxy /__________port 80: Frontal 2 + \ + \_________port 80: Frontal 3 +~~~ + +Pour la mise en cache du contenu, Squid se comporte un peu comme un navigateur : il met en cache (ou pas !) selon les entêtes HTTP +envoyés par les différents contenus. Il permet également la gestion des réponses "304 - Not modified" qui évitent aux navigateurs +de télécharger plusieurs fois le même contenu si il n'a pas changé. + +## Installation + +Voir [wiki:HowtoSquid] + +## Configuration + +*squid.conf* pour une configuration basique : + +~~~ +#acl all src 0.0.0.0/0.0.0.0 +acl localhost src 127.0.0.1/255.255.255.255 +acl purge method PURGE + + allow purge localhost + allow all + +logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %h" "%{User-Agent}>h" %Ss:%Sh +access_log /var/log/squid3/access.log combined +emulate_ on +logfile_rotate 365 + + 80 vhost +cache_peer 127.0.0.1 parent 8080 0 no-query originserver + +refresh_pattern . 1 20% 4320 ignore-reload +coredump_dir /var/spool/squid3 + + on +strip_query_terms off + +cache_dir ufs /var/spool/squid3 15000 16 256 +cache_mem 1000 MB +maximum_object_size_in_memory 1000 KB +~~~ + +## Pages d'erreur + +Il semble évident que les pages d'erreur applicatives doivent s'assurer de ne pas être mises en cache (ça c'est le boulot des développeurs). Pour certains types d'erreur (connexions refusées, 404, etc.), elles sont suceptibles d'être mises en "cache négatif" (TCP_NEGATIVE_HIT). Pour éviter cela, on ajoutera l'option : + +~~~ +negative_ttl 0 +~~~ + +Pour ne pas cacher certains codes d'erreur spécifiques, on fera par exemple : + +~~~ +acl badreq 400 +cache deny badreq +~~~ + +## Purge du cache + +Pour purger une page précise : + +~~~ +squidclient -p80 -m PURGE +~~~ + +Pour purger tout le cache, une méthode douce (les connexions en cours ne sont pas coupées) mais lente (les nouvelles connexions vont échouer pendant ce temps) : + +~~~ +/etc/init.d/squid3 stop +echo "" > /var/spool/squid3/swap.state +rm -rf /var/spool/squid3/0* +/usr/sbin/squid3 -z +/etc/init.d/squid3 start +~~~ + +Une méthode quasi-instantanée et violente (coupure des connexions en cours) : + +~~~ +kill -9 `cat /var/run/squid3.pid` +echo "Deleting data file..." +# rm -f /var/spool/squid3/swap.state +rm -rf /var/spool/squid3/* +/etc/init.d/squid3 start +~~~ + +## Divers + +### Authentification HTTP avec Squid + +Si une authentification HTTP est présente sur les frontaux web, il est nécessaire d'ajouter l'option *login=PASS* à la directe _cache_peer_' : +~~~ +cache_peer 127.0.0.1 parent 8080 0 no-query originserver login=PASS +~~~ + +### Apache et Squid sur le port 80 + +Pour ajouter de façon souple un reverse-proxy Squid sur un serveur web existant, il suffit de faire écouter Squid sur le port 80 +mais avec une adresse IP distincte d'Apache (ou Nginx) : + +~~~ + 192.0.43.10:80 vhost +cache_peer 192.0.43.7 parent 80 0 no-query originserver login=PASS +~~~ + +Attention, il faudra aussi modifier le serveur web pour qu'il n'écoute pas sur toutes les IPs de la machine. +Pour Apache, on modifiera par exemple : + +~~~ +#Listen 80 +Listen 127.0.0.1:80 +Listen 192.0.43.7:80 +Listen 192.0.43.8:80 +~~~ + +On pourra donc tester/activer Squid simplement en changeant l'enregistrement DNS du site concerné ! diff --git a/HowtoStrongSwan.md b/HowtoStrongSwan.md new file mode 100644 index 00000000..1030b79f --- /dev/null +++ b/HowtoStrongSwan.md @@ -0,0 +1,80 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto strongSwan + + + +StrongSwan est un fork de FreeS/WAN, permettant de gérer des VPNs IPsec sur des systèmes à base de noyau Linux. Il inclu 2 démons, Pluto et Charon, gérant respectivement les protocoles IKEv1 et IKEv2 d'IPsec. + +## Installation + +~~~ +# aptitude install strongswan strongswan-starter +~~~ + +## Configuration + +La configuration se fait dans le fichier _/etc/ipsec.conf_. Les clés privées ou passphrases sont à indiquer dans le fichier _/etc/ipsec.secrets_ (syntaxe différente du fichier de conf). + +### Example de configuration + +Fichier _/etc/ipsec.conf_ : +~~~ +config setup + interfaces=%defaultroute + +conn myvpn + type=tunnel + # IP publique de la machine locale + left=192.0.2.18 + # Réseau privé attribué à la machine locale dans le VPN + leftsubnet=10.0.0.0/24 + # IP privée attribuée à la machine locale dans le VPN + leftsourceip=10.0.0.1 + # IP publique de la machine distante + right=198.51.100.56 + # Réseau privé attribué à la machine distante dans le VPN + rightsubnet=10.0.1.0/24 + auto=route + authby=secret +~~~ + +Fichier _/etc/ipsec.secrets_ : +~~~ +192.0.2.18 198.51.100.56 : PSK "mypassphrase" +~~~ + +Pour pouvoir joindre le réseau privé distant, il faut ajouter une route comme suit : +~~~ +route add -net 10.0.1.0/24 gw 10.0.0.1 +~~~ + +## Administration + +### État du VPN + +/!\ Contrairement à OpenBSD, sur Linux la commande `route` ne retourne pas les routes IPsec. Pour gérer le réseau IPsec sous Linux, on peut utiliser les commandes `ip xfrm ...`. + +~~~ +# ipsec status +~~~ + +ou + +~~~ +# ip xfrm policy +~~~ + +### Gérer les démons pluto et charon + +En cas de changement dans la conf : +~~~ +ipsec start|stop|restart|reload +~~~ + +### Gérer les VPN + +En cas de perte de connexion/problème de lifetime... +~~~ +# ipsec down|up +~~~ \ No newline at end of file diff --git a/HowtoSudo.md b/HowtoSudo.md new file mode 100644 index 00000000..39112563 --- /dev/null +++ b/HowtoSudo.md @@ -0,0 +1,26 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Sudo + + +## Configuration + +La configuration de sudo se passe dans le fichier _/etc/sudoers_ qu'il est conseillé d'éditer avec la commande `visudo`. + +### Exemples d'autorisations particulières + +Autoriser l'édition d'un fichier de manière sécurisée et autoriser l'accès à un script d'init : +~~~ +jdoe ALL = (ALL) sudoedit /path/file +alice ALL = (root) /etc/init.d/apache2 +~~~ + +`sudoedit` utilise par défaut l'éditeur par défaut pour autoriser *uniquement* l'édition du fichier en question. Tout autres actions (exécution d'un shell à l'intérieur de celui-ci, ouverture d'autres fichiers…) se feront avec les droits de l'utilisateur ayant exécuté sudo et non en tant que root. + +### Lister les autorisations + +Pour afficher les actions autorisées pour l'utilisateur courant par sudo, utiliser l'option "-l". + +## Passer en root + +On recommande sudo -i, plutôt que sudo su. diff --git a/HowtoSupervisor.md b/HowtoSupervisor.md new file mode 100644 index 00000000..6f63a1ad --- /dev/null +++ b/HowtoSupervisor.md @@ -0,0 +1,26 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Supervisor + + + +~~~ +apt install supervisor +~~~ + +## Configuration + +Fichier /etc/supervisor/supervisord.conf + +Par exemple pour écouter sur le port TCP/9001 (sans authentification) : + +~~~ +[inet_] +port = 9001 +~~~ + +On peut ensuite faire : + +~~~ +$ supervisorctl -s status +~~~ diff --git a/HowtoSympa.md b/HowtoSympa.md new file mode 100644 index 00000000..39f2275b --- /dev/null +++ b/HowtoSympa.md @@ -0,0 +1,32 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Sympa + + + +Sympa est un logiciel de gestion de listes de diffusion. + +## Installation + +~~~ +# aptitude install sympa +~~~ + +Sous Debian Squeeze, voici quelques manipulations nécessaires suite à l'installation : + +~~~ +# chown sympa:sympa /usr/lib/sympa/lib/sympa/queue +# chmod u+s /usr/lib/sympa/lib/sympa/queue +# chown root /etc/postfix/sympa.aliases +~~~ + +## FAQ + +J'ai des messages de ce type alors que example.com n'est pas/plus du tout domaine : + +~~~ +Nov 9 18:35:18 serveur task_manager[7285]: List::load() No such robot (virtual domain) example.com +~~~ + +Cela pourrait venir de tâches à nettoyer dans /var/spool/sympa/task/ +Au passage, vérifier en base de données qu'il n'y a pas/plus rien relatif à example.com dans subscriber_table, session_table, logs_table. diff --git a/HowtoTFTPD.md b/HowtoTFTPD.md new file mode 100644 index 00000000..c409759b --- /dev/null +++ b/HowtoTFTPD.md @@ -0,0 +1,15 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +Installation de tftpd-hpa : `sudo aptitude install tftpd-hpa.`[[BR]] + +Ensuite il faut configurer le fichier de configuration `/etc/default/tftpd-hpa` et mettre « yes » à la +ligne _RUN_DEAMON_, et modifier la ligne _OPTIONS_ en ajoutant _-c_. +`OPTIONS="-c -l -s /var/lib/tftpboot"`[[BR]] +Le paramètre _-c_ permet d'autoriser la création de fichiers (indépendamment des droits du système de fichiers). + +Démarrer le serveur.[[BR]] + +` /etc/init.d/tftpd-hpa start ` + +Par défaut le répertoire de stockage est `/var/lib/tftpboot/` et il est accessible en lecture/écriture par _nobody_ + diff --git a/HowtoTerraform.md b/HowtoTerraform.md new file mode 100644 index 00000000..407dba93 --- /dev/null +++ b/HowtoTerraform.md @@ -0,0 +1,6 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Terraform + + + diff --git a/HowtoTokyoTyrant.md b/HowtoTokyoTyrant.md new file mode 100644 index 00000000..bb5dd282 --- /dev/null +++ b/HowtoTokyoTyrant.md @@ -0,0 +1,78 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Tokyo Tyrant + +Tokyo Cabinet est une base de données noSQL clé-valeur qui stocke ses données avec une méthode très simple (tirée de [DBM](http://en.wikipedia.org/wiki/Dbm) implémentation de Ken Thompson !). Sa dernière implémentation a été renommée en *Kyoto Cabinet*. Une surcouche réseau a été implémentée, nommée *Tokyo Tyrant* puis renommée en *Kyoto Tycoon*. + + [[BR]] + + +## Installation + +Sous Debian Squeeze, on trouve encore Tokyo Tyrant : + +~~~ +# aptitude install tokyotyrant +~~~ + +## Configuration + + + +La configuration se trouve dans le fichier _/etc/default/tokyotyrant_. + +Les données se trouvent dans _/var/lib/tokyotyrant/data/tokyotyrant.tch_ + +Par défaut sous Debian, Tokyo Tyrant n'est accessible que via une socket : _/var/run/tokyotyrant/tokyotyrant.sock_ + +Il est lancé ainsi : + +~~~ +/usr/sbin/ttserver -port 0 -dmn -pid /var/run/tokyotyrant/tokyotyrant.pid -log /var/log/tokyotyrant/tokyotyrant.log -host /var/run/tokyotyrant/tokyotyrant.sock /var/lib/tokyotyrant/data/tokyotyrant.tch#bnum=1000000 +~~~ + +On peut également le rendre accessible via un port réseau : + +~~~ +SERVERPORT=1978 +~~~ + +## Client + +~~~ +$ tcrmgr version +Tokyo Tyrant version 1.1.40 (323:0.91) for Linux +Copyright (C) 2007-2010 Mikio Hirabayashi +$ tcrmgr put -port 0 /var/run/tokyotyrant/tokyotyrant.sock foo bar +$ tcrmgr get -port 0 /var/run/tokyotyrant/tokyotyrant.sock foo +bar +$ tcrmgr list -port 0 /var/run/tokyotyrant/tokyotyrant.sock +foo +~~~ + +## PHP + +~~~ +# aptitude install php5-tokyo-tyrant +~~~ + +## Sessions PHP avec Tokyo Tyrant + +~~~ +tokyo_tyrant.session_salt="randomlongstring" +session.save_handler=tokyo_tyrant +session.save_path="tcp://127.0.0.1:1978" +~~~ + +## Sauvegardes + +TODO + +## Réplication + +TODO + +## Monitoring + +TODO + diff --git a/HowtoTomcat.md b/HowtoTomcat.md new file mode 100644 index 00000000..a344e176 --- /dev/null +++ b/HowtoTomcat.md @@ -0,0 +1,405 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Howto Tomcat + + + +### Installation + +Sous Debian Lenny, Tomcat 6 n'est pas présent. Nous utilisons donc un backport de la version +présente dans Squeeze. Vous pouvez la retrouver dans le repository Evolix +dans + +~~~ +# aptitude install sun-java6-jdk tomcat6 +~~~ + +La configuration de la JVM dans le fichier _/etc/default/tomcat6_ : + +~~~ +# Rare sont les cas ou l'on peut activer le Java security manager +TOMCAT6_SECURITY=no + +# Reglages memoire de base (a adapter selon votre quantite de RAM, dans l'exemple on a une seule instance et 4 Go de RAM) +JAVA_OPTS="${JAVA_OPTS} -Xms1g -Xmx2g -XX:NewSize=512m -XX:MaxPermSize=256m -Xss256k" + +# Reglages du garbage collector +JAVA_OPTS="${JAVA_OPTS} -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:CMSInitiatingOccupancyFraction=80" + +# Compression des adresses 64bits sur 32bits pour gagner en memoire libre +JAVA_OPTS="${JAVA_OPTS} -XX:+UseCompressedOops" + +# file limits pour eviter les "too many open files" +ulimit -n 8192 +~~~ + +La configuration de Tomcat peut être dispersée dans de nombreux fichiers +et utilise des variables à bien avoir en tête : + +~~~ +CATALINA_BASE : ${catalina.base} = /var/lib/tomcat6 +CATALINA_HOME : ${catalina.home} = /usr/share/tomcat6 +~~~ + +En ce qui concerne le chargement des classes (Class Loader), un résumé pragmatique pourrait être : + +~~~ +/usr/share/tomcat6/lib/ : classes communes à toutes les webapps +WebappX/WEB-INF/lib/ : classes spécifiques à la webapp WebappX +~~~ + +Pour désactiver le déploiement automatique (à chaud), on modifie le fichier /etc/tomcat6/server.xml : +~~~ + +~~~ + +Pour installer le driver JDBC pour MySQL : + +~~~ +# aptitude install libmysql-java +# cd /usr/share/tomcat6/lib/ +# ln -s ../../java/mysql-connector-java.jar mysql.jar +~~~ + +Pour installer le driver JDBC pour PostgreSQL : + +~~~ +# aptitude install libpg-java +# cd /usr/share/tomcat6/lib/ +# ln -s ../../java/mysql-connector-java.jar mysql.jar +~~~ + +## Instances + +Il est possible d'avoir plusieurs instances de Tomcat. Cela permet de faire tourner plusieurs processus Tomcat de faon complétement indépendantes, avec leurs propres réglages et en permettant des arrêts/redémarrages d'une instance sans impacter les autres. +Sous Debian, il existe notamment un script nommé tomcat6-instance-create qui se charge de copier les répertoires utiles (conf, logs, webapps, etc.) tout en mutualisant les binaires. Cela +évite de dupliquer les binaires communs et permet d’optimiser les mises à jour. + +~~~ +# ls /src/tomcat6/*/ +/src/tomcat6/app1: +bin conf logs pid temp webapps work +/src/tomcat6/app2: +bin conf logs pid temp webapps work +~~~ + +Voici comment créer une nouvelle instance : + +~~~ +# tomcat6-instance-create /srv/tomcat6/app3 +# useradd -d /srv/tomcat6/app3 app3 +# mkdir /srv/tomcat6/app3/pid +# chown app3:app3 /srv/tomcat6/app3/pid +# chown -R app3:app3 /srv/tomcat6/app3 +# chmod -R u=rwX,g=rX,o= /srv/tomcat6/app3 +# chmod -R g+ws /srv/tomcat6/app3 +~~~ + +Il reste ensuite ajuster les ports AJP, HTTP, SHUTDOWN et les scripts de startup/shutdown. + +### Unité systemd utilisateur + +Pour utiliser confortablement les instances on pourra utiliser systemd en mode utilisateur. Les développeurs pourront arrêter et démarrer l'instance d'eux-même. +Pour faire ceci, il faut installer le paquet libpam-systemd (nécessite un reboot), et créer l'unité tomcat dans /etc/systemd/user/tomcat.service. + + +~~~ +[Unit] +Description=Tomcat %u. +After=network.target + +[Service] +WorkingDirectory=/home/%u +Environment="CATALINA_BASE=/home/%u/tomcat" +EnvironmentFile=/home/%u/tomcat/conf/env +UMask=0002 +ExecStart=/usr/share/tomcat7/bin/startup.sh +ExecStop=/usr/share/tomcat7/bin/shutdown.sh +ExecStopPost=/bin/sh -c date | /usr/bin/mail -s "%H/%u : Shutdown instance" foo@bar.com +Type=forking + +[Install] +WantedBy=default.target +~~~ + +Conserver la session de l'utilisateur. + + +~~~ +# loginctl enable-linger foo +~~~ + +Enfin, l'utilisateur pour activer l'instance au démarrage et la démarrer, voir le status, … + +~~~ +$ systemctl --user enable tomcat +$ systemctl --user start tomcat +$ systemctl --user status -l tomcat +$ systemctl --user restart tomcat +$ systemctl --user stop tomcat +~~~ + + + +## Oracle JDK + +Depuis le ?? le JDK propriétaire d'oracle n'est plus dans les dépôts Debian, il faut donc l'installer à la main. + +~~~ +update-alternatives --install "/usr/bin/java" "java" "/usr/local/opt/jdk1.6.0_30/bin/java" 1 +update-alternatives --set java /usr/local/opt/jdk1.6.0_30/bin/java + +update-alternatives --install "/usr/bin/java" "java" "/usr/local/opt/jdk1.6.0_30/bin/java" 1 +update-alternatives --set java /usr/local/opt/jdk1.6.0_30/bin/java + +update-alternatives --install "/usr/bin/keytool" "keytool" "/usr/local/opt/jdk1.6.0_30/bin/keytool" 1 +update-alternatives --set keytool /usr/local/opt/jdk1.6.0_30/bin/keytool + +update-alternatives --install "/usr/bin/pack200" "pack200" "/usr/local/opt/jdk1.6.0_30/bin/pack200" 1 +update-alternatives --set pack200 /usr/local/opt/jdk1.6.0_30/bin/pack200 + +update-alternatives --install "/usr/bin/rmid" "rmid" "/usr/local/opt/jdk1.6.0_30/bin/rmid" 1 +update-alternatives --set rmid /usr/local/opt/jdk1.6.0_30/bin/rmid + +update-alternatives --install "/usr/bin/rmiregistry" "rmiregistry" "/usr/local/opt/jdk1.6.0_30/bin/rmiregistry" 1 +update-alternatives --set rmiregistry /usr/local/opt/jdk1.6.0_30/bin/rmiregistry + +update-alternatives --install "/usr/bin/unpack200" "unpack200" "/usr/local/opt/jdk1.6.0_30/bin/unpack200" 1 +update-alternatives --set unpack200 /usr/local/opt/jdk1.6.0_30/bin/unpack200 + +update-alternatives --install "/usr/bin/orbd" "orbd" "/usr/local/opt/jdk1.6.0_30/bin/orbd" 1 +update-alternatives --set orbd /usr/local/opt/jdk1.6.0_30/bin/orbd + +update-alternatives --install "/usr/bin/servertool" "servertool" "/usr/local/opt/jdk1.6.0_30/bin/servertool" 1 +update-alternatives --set servertool /usr/local/opt/jdk1.6.0_30/bin/servertool + + +update-alternatives --install "/usr/bin/tnameserv" "tnameserv" "/usr/local/opt/jdk1.6.0_30/bin/tnameserv" 1 +update-alternatives --set tnameserv /usr/local/opt/jdk1.6.0_30/bin/tnameserv + +update-alternatives --install "/usr/bin/jexec" "jexec" "/usr/local/opt/jdk1.6.0_30/bin/jexec" 1 +update-alternatives --set jexec /usr/local/opt/jdk1.6.0_30/bin/jexec + +~~~ + +En Wheezy JRE 7 ou + +~~~ +update-alternatives --install "/usr/bin/policytool" "policytool" "/usr/local/opt/jdk1.7.0_45/jre/bin/policytool" 1 +update-alternatives --install "/usr/bin/appletviewer" "appletviewer" "/usr/local/opt/jdk1.7.0_45/bin/appletviewer" 1 +update-alternatives --install "/usr/bin/extcheck" "extcheck" "/usr/local/opt/jdk1.7.0_45/bin/extcheck" 1 +update-alternatives --install "/usr/bin/idlj" "idlj" "/usr/local/opt/jdk1.7.0_45/bin/idlj" 1 +update-alternatives --install "/usr/bin/jar" "jar" "/usr/local/opt/jdk1.7.0_45/bin/jar" 1 +update-alternatives --install "/usr/bin/jarsigner" "jarsigner" "/usr/local/opt/jdk1.7.0_45/bin/jarsigner" 1 +update-alternatives --install "/usr/bin/javac" "javac" "/usr/local/opt/jdk1.7.0_45/bin/javac" 1 +update-alternatives --install "/usr/bin/java" "java" "/usr/local/opt/jdk1.7.0_45/bin/java" 1 +update-alternatives --install "/usr/bin/javadoc" "javadoc" "/usr/local/opt/jdk1.7.0_45/bin/javadoc" 1 +update-alternatives --install "/usr/bin/javah" "javah" "/usr/local/opt/jdk1.7.0_45/bin/javah" 1 +update-alternatives --install "/usr/bin/javap" "javap" "/usr/local/opt/jdk1.7.0_45/bin/javap" 1 +update-alternatives --install "/usr/bin/jcmd" "jcmd" "/usr/local/opt/jdk1.7.0_45/bin/jcmd" 1 +update-alternatives --install "/usr/bin/jconsole" "jconsole" "/usr/local/opt/jdk1.7.0_45/bin/jconsole" 1 +update-alternatives --install "/usr/bin/jdb" "jdb" "/usr/local/opt/jdk1.7.0_45/bin/jdb" 1 +update-alternatives --install "/usr/bin/jhat" "jhat" "/usr/local/opt/jdk1.7.0_45/bin/jhat" 1 +update-alternatives --install "/usr/bin/jinfo" "jinfo" "/usr/local/opt/jdk1.7.0_45/bin/jinfo" 1 +update-alternatives --install "/usr/bin/jmap" "jmap" "/usr/local/opt/jdk1.7.0_45/bin/jmap" 1 +update-alternatives --install "/usr/bin/jps" "jps" "/usr/local/opt/jdk1.7.0_45/bin/jps" 1 +update-alternatives --install "/usr/bin/jrunscript" "jrunscript" "/usr/local/opt/jdk1.7.0_45/bin/jrunscript" 1 +update-alternatives --install "/usr/bin/jsadebugd" "jsadebugd" "/usr/local/opt/jdk1.7.0_45/bin/jsadebugd" 1 +update-alternatives --install "/usr/bin/jstack" "jstack" "/usr/local/opt/jdk1.7.0_45/bin/jstack" 1 +update-alternatives --install "/usr/bin/jstat" "jstat" "/usr/local/opt/jdk1.7.0_45/bin/jstat" 1 +update-alternatives --install "/usr/bin/jstatd" "jstatd" "/usr/local/opt/jdk1.7.0_45/bin/jstatd" 1 +update-alternatives --install "/usr/bin/native2ascii" "native2ascii" "/usr/local/opt/jdk1.7.0_45/bin/native2ascii" 1 +update-alternatives --install "/usr/bin/rmic" "rmic" "/usr/local/opt/jdk1.7.0_45/bin/rmic" 1 +update-alternatives --install "/usr/bin/schemagen" "schemagen" "/usr/local/opt/jdk1.7.0_45/bin/schemagen" 1 +update-alternatives --install "/usr/bin/serialver" "serialver" "/usr/local/opt/jdk1.7.0_45/bin/serialver" 1 +update-alternatives --install "/usr/bin/wsgen" "wsgen" "/usr/local/opt/jdk1.7.0_45/bin/wsgen" 1 +update-alternatives --install "/usr/bin/wsimport" "wsimport" "/usr/local/opt/jdk1.7.0_45/bin/wsimport" 1 +update-alternatives --install "/usr/bin/xjc" "xjc" "/usr/local/opt/jdk1.7.0_45/bin/xjc" 1 +update-alternatives --set policytool /usr/local/opt/jdk1.7.0_45/jre/bin/policytool +update-alternatives --set appletviewer /usr/local/opt/jdk1.7.0_45/bin/appletviewer +update-alternatives --set extcheck /usr/local/opt/jdk1.7.0_45/bin/extcheck +update-alternatives --set idlj /usr/local/opt/jdk1.7.0_45/bin/idlj +update-alternatives --set jar /usr/local/opt/jdk1.7.0_45/bin/jar +update-alternatives --set jarsigner /usr/local/opt/jdk1.7.0_45/bin/jarsigner +update-alternatives --set javac /usr/local/opt/jdk1.7.0_45/bin/javac +update-alternatives --set java /usr/local/opt/jdk1.7.0_45/bin/java +update-alternatives --set javadoc /usr/local/opt/jdk1.7.0_45/bin/javadoc +update-alternatives --set javah /usr/local/opt/jdk1.7.0_45/bin/javah +update-alternatives --set javap /usr/local/opt/jdk1.7.0_45/bin/javap +update-alternatives --set jcmd /usr/local/opt/jdk1.7.0_45/bin/jcmd +update-alternatives --set jconsole /usr/local/opt/jdk1.7.0_45/bin/jconsole +update-alternatives --set jdb /usr/local/opt/jdk1.7.0_45/bin/jdb +update-alternatives --set jhat /usr/local/opt/jdk1.7.0_45/bin/jhat +update-alternatives --set jinfo /usr/local/opt/jdk1.7.0_45/bin/jinfo +update-alternatives --set jmap /usr/local/opt/jdk1.7.0_45/bin/jmap +update-alternatives --set jps /usr/local/opt/jdk1.7.0_45/bin/jps +update-alternatives --set jrunscript /usr/local/opt/jdk1.7.0_45/bin/jrunscript +update-alternatives --set jsadebugd /usr/local/opt/jdk1.7.0_45/bin/jsadebugd +update-alternatives --set jstack /usr/local/opt/jdk1.7.0_45/bin/jstack +update-alternatives --set jstat /usr/local/opt/jdk1.7.0_45/bin/jstat +update-alternatives --set jstatd /usr/local/opt/jdk1.7.0_45/bin/jstatd +update-alternatives --set native2ascii /usr/local/opt/jdk1.7.0_45/bin/native2ascii +update-alternatives --set rmic /usr/local/opt/jdk1.7.0_45/bin/rmic +update-alternatives --set schemagen /usr/local/opt/jdk1.7.0_45/bin/schemagen +update-alternatives --set serialver /usr/local/opt/jdk1.7.0_45/bin/serialver +update-alternatives --set wsgen /usr/local/opt/jdk1.7.0_45/bin/wsgen +update-alternatives --set wsimport /usr/local/opt/jdk1.7.0_45/bin/wsimport +~~~ + +### Activation du « access_log » de Tomcat + +Pour loguer tous les accès, il suffit de décommenter cette partie dans le server.xml : +~~~ + +~~~ + +### Reverse proxy avec Apache + +Le but est de se passer du mod_jk est de faire un reverse proxy. + +--> Apache:80 --> Tomcat:8080 + +Activez le mod proxy et proxy_ puis modifier la configuration du module `mods-enabled/proxy.conf`. + +~~~ + + +ProxyRequests Off + + AddDefaultCharset off + Order allow,deny + Allow from all + + +# Enable/disable the handling of HTTP/1.1 "Via:" headers. +# ("Full" adds the server version; "Block" removes all outgoing Via: headers) +# Set to one of: Off | On | Full | Block +ProxyVia On + + +~~~ + +Puis dans le vhost concerné : + +~~~ + + + # FQDN principal + ServerName myapp.webiste.com + + ProxyPass / + ProxyPassReverse / + + + Order allow,deny + Allow from all + + + +~~~ + +Note : attention à bien mettre le '/' final sous peine de s'arracher les cheveux avec un _Client denied by server configuration_ + +### Installation du mod-jk d'Apache + +le mod-jk d'Apache permet de gérer la communication entre le serveur web Apache et le conteneur de servlets Tomcat. + +Pour l'installer : +~~~ +# aptitude install libapache2-mod-jk +~~~ + +Éditez le fichier _/etc/libapache2-mod-jk/workers.properties_ : +~~~ +# On utilise tomcat en version 6 +workers.tomcat_home=/usr/share/tomcat6 + +# On utilise le moteur java de Sun +workers.java_home=/usr/lib/jvm/java-6-sun + +# Liste des workers +worker.list=app1_worker app2_worker #... + +# Paramètre pour le worker app1_worker +worker.app1_worker.port=8009 +worker.app1_worker.host=localhost +worker.app1_worker.type=ajp13 +~~~ + +Ensuite, il faut créer le fichier de configuration Apache pour mod_jk, dans _/etc/apache2/conf.d/_ : +~~~ +JkWorkersFile /etc/libapache2-mod-jk/workers.properties +JkLogFile /var/log/apache2/mod_jk.log +JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " +JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories +JkRequestLogFormat "%w %V %T +~~~ + +Pour chaque application java, on crée un vhost Apache, en prenant le modèle suivant : +~~~ + + ServerName app1.evolix.net + ServerAlias www.app1.evolix.net + TransferLog /var/log/apache2/app1.log + ErrorLog /var/log/apache2/app1_error.log + JkMount /* app1_worker + +~~~ + +Enfin, on s'assure que le tomcat écoute bien sur le port donné dans la configuration du worker (8009 dans l'exemple). Le fichier _/etc/tomcat6/server.xml_ doit contenir la ligne : +~~~ + +~~~ + +Ne pas oublier de charger le module mod_jk et d'activer le nouveau vhost : +~~~ +# a2enmod jk +# a2ensite app1 +~~~ + +### Manager Tomcat + +Une des méthodes possibles pour le déployment d'applications java est de le faire via une interface web, le manager Tomcat. + +Installation : +~~~ +aptitude install tomcat6-admin +~~~ + +Il faut ensuite ajouter un utilisateur au role _manager_, dans le fichier _/etc/tomcat6/tomcat-users.xml_ (équivalent d'un fichier htpasswd d'Apache) : +~~~ + + [...] + + + +~~~ + +Une fois Tomcat redémarré, l'accès au manager ce fait sur l'URI : + +### Connecteur HTTP + +Activer la compression gzip de certains types de fichiers : + +Dans le fichier _/etc/tomcat6/server.xml_, rajouter ceci dans le connecteur HTTP : +~~~ +compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/plain,text/javascript,application/javascript" +~~~ + +### FAQ + +Qu'est-ce que c'est JSVC ? Pourquoi l'utiliser ? + +JSVC est un outil permettant d'uniformiser le lancement de "daemon" en JAVA pour tous les systèmes, notamment sous Windows. +Sous Linux, il est parfois utilisé, mais son utilisation reste déconseillée vu qu'il existe d'autres outils pour faire cela *et* que son utilisation ne permet pas une gestion via JMX. +Sous Debian, il a été utilisé sous Debian Lenny, mais il ne sera plus utilisé dans les prochaines versions. + +Tomcat n'écoute pas en IPv4, pourquoi ? Comment le corriger ? + +Les versions récentes de Java préfèrent l'IPv6 si elle est présente. Le problème c'est que dans ce cas, il peut arriver que tomcat n'écoute pas en IPv4. +Il faut alors modifier les propriétés par défaut en ajoutant ceci aux JAVA_OPTS : +~~~ +-Djava.net.preferIPv4Stack=true +~~~ + diff --git a/HowtoTrac.md b/HowtoTrac.md new file mode 100644 index 00000000..cbfe1383 --- /dev/null +++ b/HowtoTrac.md @@ -0,0 +1,8 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Trac + +~~~ +~/trac/usr/bin$ PYTHONPATH=/home/foo/trac/usr/lib/python2.4/site-packages/ python trac-admin \ + /home/foo/projects/myproject permission add authenticated WIKI_CREATE WIKI_MODIFY +~~~ \ No newline at end of file diff --git a/HowtoTsung.md b/HowtoTsung.md new file mode 100644 index 00000000..bd32ceef --- /dev/null +++ b/HowtoTsung.md @@ -0,0 +1,82 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Utilisation de Tsung + +[Manuel de Tsung](http://tsung.erlang-projects.org/user_manual.html) + +### Installation + +~~~ +# aptitude install tsung +~~~ + +### Enregistrement d'une session + +~~~ +$ tsung-recorder start +... +$ tsung-recorder stop +~~~ + +Compléter les entêtes XML grâces aux exemples dans /usr/share/doc/tsung/examples/ + +Un exemple : + + +~~~ + + + + + + + + + + + + + + + + + + + + + +> + version='1.1' method='GET'>> +[…] + + +~~~ + + +### Rejouer des sessions + +~~~ +tsung -f tsung-toto.xml start +~~~ + +### Générer les stats + +~~~ +cd ~/.tsung/log/20081103-16:21 +/usr/lib/tsung/bin/tsung_stats.pl +~~~ + +### Améliorer les performances de Tsung + +* ulimit +* Baisser le loglevel + +### Mode multi clients + +Il faut pouvoir se connecter en ssh via clé et sans passphrase.[[BR]] + +Il faut que le nom de machine du master résout sur les slaves. (On pourra modifier le fichier hosts).[[BR]] + +/!\ Il faut la même version de tsung et erlang et des librairies sur chaque machine.[[BR]] + +/!\ Il ne faut pas de pare-feu, des ports dynamiques sont ouverts pour communiquer entre le master et les slaves. \ No newline at end of file diff --git a/HowtoTypo3.md b/HowtoTypo3.md new file mode 100644 index 00000000..463e5ce5 --- /dev/null +++ b/HowtoTypo3.md @@ -0,0 +1,46 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Typo3 + +Version : Typo3 4.5.22 LTS + +~~~ +# aptitude install imagemagick graphicsmagick php5-imagick +# aptitude install php-apc php5-curl +~~~ + +Paramètres PHP à modifier : + +~~~ +upload_max_filesize => 20 Mo +max_excution_time => 90s +Activer la fonction exec() +~~~ + +Modules Apache à activer et autoriser via AllowOverride : + +~~~ +mod_expires +mod_rewrite +mod_deflate +~~~ + +~~~ +% touch ENABLE_INSTALL_TOOL +% chmod g+w ENABLE_INSTALL_TOOL +~~~ + +Droits à ajuster : + +~~~ +% chmod g+w typo3temp/ +% chmod g+w typo3conf/localconf.php +% chmod g+w typo3conf +% chmod g+w chmod g+w fileadmin/ typo3conf/ext/ uploads/ +% chmod g+w typo3conf/l10n/ +% chmod g+w uploads/pics/ +% chmod g+w uploads/media/ +% chmod g+w uploads/tf/ +% chmod g+w fileadmin/_temp_/ +% chmod g+w typo3/ext/ +~~~ diff --git a/HowtoUniFo.md b/HowtoUniFo.md new file mode 100644 index 00000000..4f451a30 --- /dev/null +++ b/HowtoUniFo.md @@ -0,0 +1,79 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto UniFi + +Points d'accès Wi-Fi Ubiquiti : + +Administration via soft en Java/MongoDB :( + +Récupérer la dernière version de UniFi.unix.zip sur + +~~~ +# aptitude install mongodb + +$ unzip UniFi.unix.zip +$ cd UniFi +$ java -jar lib/ace.jar start +^C +$ rm -f data/db/journal/* +$ vim data/system.properties + +unifi.db.nojournal=true + +$ java -jar lib/ace.jar start +$ iceweasel +~~~ + +Attention, l'interface ne détecte la borne qui si elle est dans un même segment réseau (niveau 2, donc pas de routage...). + +Une fois la borne configurée, vous pouvez y accéder en SSH (récupérer son IP via l'interface... ou fixer son IP via DHCP) +et le login / pass de l'interface, vous avez un OpenWRT :) + +~~~ +$ ssh root@10.0.0.11 + +BZ.v3.2.7# info + +Model: UAP +Version: 3.2.7.2816 +MAC Address: 24:a4:3e:a6:42:a2 +IP Address: 10.0.0.11 +Hostname: UBNT +Uptime: 2151 seconds + +Status: Connected (http://10.0.0.1:8080/inform) +~~~ + +## FAQ + +### Supprimer la preallocation de MongoDB + +Si vous avez oublié d'ajuster "nojournal=true" vous aurez 3,3 Go dans data/db/journal/ : + +~~~ +$ pkill java +$ rm data/db/journal/* +$ vim data/system.properties + +unifi.db.nojournal=true + +$ java -jar lib/ace.jar start +~~~ + +### Reset de la borne + +Appuyer 10 secondes sur le bouton RESET de la borne, elle pase au rose et reboot. + +### Sauvegarde des données de l'interface + +Si vous n'avez plus vos données d'interface, il est quasi-impossible d'accéder à la borne sans réinstaller une interface et reset la borne. +Il est donc conseillé de sauvegarder les données : + +~~~ +$ tar cf unifi-backup.tar data/ +~~~ + +Ces données peuvent être restaurées sur une nouvelle installation pour retrouver les paramètres. + + + diff --git a/HowtoUnicorn.md b/HowtoUnicorn.md new file mode 100644 index 00000000..6fc9b3e0 --- /dev/null +++ b/HowtoUnicorn.md @@ -0,0 +1,112 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Howto Unicorn + +Unicorn est un serveur HTTP spécifiquement fait pour des application RoR. Il se place en règle générale derrière un serveur HTTP tel que Apache ou Nginx (notamment car il n'est pas optimisé pour gérer des requêtes de clients lents). + +### Installation + +Unicorn se présente comme une gem qui peut être installé classiquement : +~~~ +# gem install unicorn +~~~ + +### Script d'init Debian + +Voici un script d'init Debian permettant de lancer plusieurs instance de Unicorn dans /home : +~~~ +#!/bin/sh + +### BEGIN INIT INFO +# Provides: unicorn +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +### END INIT INFO + +set -e +. /lib/lsb/init-functions + +. /etc/default/unicorn + +case "$1" in + start) + for instance in $INSTANCES; do + rails_env=`head -1 /home/$instance/www/current/config/database.yml |tr -d :` + PATH="/home/$instance/.rbenv/shims:/home/$instance/.rbenv/bin:/home/$instance/ruby-build/bin:$PATH" + WD="/home/$instance/www/current" + if [ -e /home/$instance/.rbenv/shims/unicorn_rails ]; then + log_daemon_msg "Starting unicorn server instance $instance..." + start-stop-daemon --start --quiet --name unicorn \ + --pidfile $WD/tmp/pids/unicorn.pid \ + --chdir $WD --chuid $instance \ + --exec /home/$instance/.rbenv/shims/unicorn_rails -- \ + -c $WD/config/unicorn.rb -D -E $rails_env + log_end_msg $? + fi + done + ;; + + stop) + for instance in $INSTANCES; do + WD="/home/$instance/www/current" + if [ -e /home/$instance/.rbenv/shims/unicorn_rails ]; then + log_daemon_msg "Stopping unicorn server instance $instance..." + start-stop-daemon --stop --quiet --name unicorn \ + --pidfile $WD/tmp/pids/unicorn.pid + log_end_msg $? + fi + done + ;; + + gracefull_stop) + for instance in $INSTANCES; do + WD="/home/$instance/www/current" + if [ -e /home/$instance/.rbenv/shims/unicorn_rails ]; then + log_daemon_msg "Stopping gracefully unicorn server instance $instance..." + start-stop-daemon --stop --quiet --name unicorn --signal QUIT \ + --pidfile $WD/tmp/pids/unicorn.pid + log_end_msg $? + fi + done + ;; + + reload) + for instance in $INSTANCES; do + WD="/home/$instance/www/current" + if [ -e /home/$instance/.rbenv/shims/unicorn_rails ]; then + log_daemon_msg "Reloading unicorn server instance $instance..." + kill -s USR2 `cat $WD/tmp/pids/unicorn.pid` + log_end_msg $? + fi + done + ;; + + restart) + for instance in $INSTANCES; do + rails_env=`head -1 /home/$instance/www/current/config/database.yml |tr -d :` + PATH="/home/$instance/.rbenv/shims:/home/$instance/.rbenv/bin:/home/$instance/ruby-build/bin:$PATH" + log_daemon_msg "Restarting unicorn server instance $instance..." + WD="/home/$instance/www/current" + if [ -e /home/$instance/.rbenv/shims/unicorn_rails ]; then + log_daemon_msg "Starting unicorn server instance $instance..." + start-stop-daemon --start --quiet --name unicorn \ + --pidfile $WD/tmp/pids/unicorn.pid \ + --chdir $WD --chuid $instance \ + --exec bundle exec unicorn -- \ + -c $WD/config/unicorn.rb -D -E $rails_env + start-stop-daemon --stop --quiet --name unicorn \ + --pidfile $WD/tmp/pids/unicorn.pid + log_end_msg $? + fi + done + ;; +*) + echo "Usage: $0 {start|stop|gracefull_stop|restart|reload}" + exit 1 + ;; +esac +~~~ + +Puis mettre la liste des instances à lancer dans le fichier _/etc/default/unicorn_. \ No newline at end of file diff --git a/HowtoVRRP.md b/HowtoVRRP.md new file mode 100644 index 00000000..15251f19 --- /dev/null +++ b/HowtoVRRP.md @@ -0,0 +1,72 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# uvrrpd + +Utiliser le demon vrrp [uvrrpd](https://forge.evolix.org/projects/uvrrpd) + +# Paquet debian wheezy vrrpd + +Utiliser le paquet evolix vrrpd wheezy avec différents patches ainsi qu'un script permettant d'utiliser les *macvlan* : +~~~ +- debian/patches/010-vrrpd-1.0_to_1.0-1exp1 +- debian/patches/120-orig_prio.patch +- debian/patches/150-fix_vrid_check.patch +- debian/patches/series +- debian/patches/100-external_script_enhanced.patch +- debian/patches/170-log_format.patch +- debian/patches/130-receive_multicast.patch +- debian/patches/140-vrrp_switch_macvlan.patch +- debian/patches/011-fix_compile_warnings.patch +- debian/patches/012-typo_help_auth_pw.patch +- debian/patches/110-slave_init_state.patch +- debian/patches/160-dont_handle_virtual_ip.patch +- [...] +- debian/vrrp_switch_macvlan +- debian/sysctl.vrrpd +- debian/README.macvlan +~~~ + +L'utilisation des macvlans permet l'utilisation des adresses mac virtuelles VRRP. + +Pour cela : + +* utiliser le script vrrp_switch_macvlan (/etc/vrrpd/vrrp_switch installé par défaut) +* utiliser l'option -x pour interdire à vrrpd de manipuler les interfaces en déléguant cette opération au script. Dans ce mode, vrrpd reçoit et emet des paquets VRRP et appelle /etc/vrrpd/vrrp_switch lors des changements d'états master/slave +* ne pas utiliser l'option -n + +## Exemple + +~~~ +/usr/sbin/vrrpd -i eth0 -x -D -d 10 -v 42 -p 100 -l wan 192.168.1.240 + +## VRRP instance "wan" +# -i eth0 : bind to eth0 (wan interface) +# -x : don't handle the virtual IP address +# -D : daemonize +# -d 10 : 10s between advertisement, 1s by default +# -v 42 : VRID +# -p 100 : priority 100 +# -l wan : Name of vrrp instance (for logging purpose) +~~~ + +Dans l'état master, l'interface vrrp_${vrid}_${interface} est crée avec la VIP et l'adresse mac VRRP 00:00:5e:00:01:${vrid} (ici interface vrrp_42_eth0, VIP 192.168.1.240 et la mac 00:00:5e:00:01:2a). + +## Sysctls + +Voir /usr/share/doc/vrrpd/sysctl.vrrpd +~~~ +net.ipv4.conf.default.rp_filter=0 +net.ipv4.conf.all.rp_filter=0 +net.ipv4.conf.all.arp_ignore=1 +net.ipv4.conf.all.arp_announce=2 +~~~ + +## Logs + +Logs dans /var/log/daemon + +Historique des changements d'états dans /var/log/vrrpd/state.$vrid + +Etat courant dans /var/run/vrrpd/vrrp-${instance_name} + +Fichier pid /var/run/vrrpd_${instance_name}_${vrid}.pid diff --git a/HowtoVagrant.md b/HowtoVagrant.md new file mode 100644 index 00000000..e1a0dd37 --- /dev/null +++ b/HowtoVagrant.md @@ -0,0 +1,90 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowtoVagrant + +Vagrant est un logiciel qui permet de configurer des environnements de développement légers, portables et reproductibles. + +À travers son fichier de configuration nommé Vagrantfile, il permet d'orchestrer la mise en place d'environnement virtuel à base de VM ou de conteneur. + +## Installation + +Des paquets Debian officiels sont disponibles, mais l'équipe de Hashicorp maintient également un paquet plus récent (sans répository) : + +## Providers + +Vagrant permet de lancer et configurer des environnements basés sur VirtualBox, VMware, Docker, Amazon EC2 et plusieurs autres. + +## Commandes de base + +1. Lancer l'environnement: +~~~ +vagrant up +~~~ + +2. Provisionner l'environnement: +~~~ +vagrant provision +~~~ + +3. Stopper l'exécution de l'environnement: +~~~ +vagrant halt +~~~ + +4. Supprimer l'environnement: +~~~ +vagrant destroy +~~~ + +5. Accéder à la machine virtuelle par SSH +~~~ +vagrant ssh +~~~ + +## Vagrantfile + +Le Vagrantfile un fichier en Ruby qui décrit le type de machine à démarrer, leurs spécifications et leur configuration initiale (provision). + +Ce fichier est unique à un projet et doit être situé à la racine de ce dernier. + +Exemple: +~~~ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +VAGRANTFILE_API_VERSION = "2" + +Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| + #Image de base de la machine virtuelle + config.vm.box = "debian/jessie64" + + #Désactivation de la synchronisation des fichiers à la racine du projet. (activé par défaut) + config.vm.synced_folder "./", "/vagrant", disabled: true + + #Spécification du provider et caractéristiques des VM. + config.vm.provider :virtualbox do |v| + v.memory = 1024 + v.cpus = 2 + v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] + v.customize ["modifyvm", :id, "--ioapic", "on"] + end + + #Définition de la machine virtuelle qui sera lancée. + config.vm.define :default do |default| + default.vm.hostname = "default" + default.vm.network :private_network, ip: "192.168.33.33" + default.vm.provision :ansible do |ansible| + ansible.limit = "default" + ansible.playbook = "provisioning/vagrant.yml" + ansible.raw_arguments = ["-b"] + end + end + + #Configuration permettant de distribuer l'image dans le Vagrant Atlas + config.push.define "atlas" do |push| + push.app = "evolix/evolinux" + push.vcs = false + end + +end +~~~ \ No newline at end of file diff --git a/HowtoVirtualBox.md b/HowtoVirtualBox.md new file mode 100644 index 00000000..34434035 --- /dev/null +++ b/HowtoVirtualBox.md @@ -0,0 +1,84 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# HowtoVirtualBox + +## Installer VirtualBox-ose sous Debian Lenny + +VirtualBox dans Lenny est très obsolète, puisqu'il est en 1.6.6. Il faut utiliser les [wiki:HowtoDebian/Backports backports] pour avoir la version 3.2.4. (La dernière version est le 4.0.6 daté du 21 Avril) + +Installation : + +~~~ +# aptitude -t lenny-backports install virtualbox-ose virtualbox-ose-dkms +# aptitude install build-essential linux-headers-`uname -r` +# dpkg-reconfigure virtualbox-ose-dkms +# modprobe vboxdrv +~~~ + +_Note : Si vous avez kvm d'installé il faut décharger le module du kernel avec `modprobe -r kvm_intel`_ + +## Installer VirtualBox sous Debian Lenny + +Il faut utiliser le _repository_ d'Oracle. + +~~~ +deb lenny contrib non-free +~~~ + +Et ajouter la clé public du dépôt : + +~~~ +wget -q -O- | sudo apt-key add - +~~~ + +Et enfin l'installer. + +~~~ +sudo aptitude update +sudo aptitude install virtualbox-4.0 +~~~ + +## phpvirtualbox + +phpvirtualbox est une application web qui permet d'administrer et de gérer les machines virtuelles (VMs), virtualisé sur un Virtualbox.[[BR]] + +[[Image(phpvirtualbox.png, 33%)]][[BR]] + +_Il est nécessaire d'avoir VirtualBox>=4.0 pour obtenir le support RDP en attendant un jour obtenir un support VNC bien intégré avec VirtualBox ..._ + +Pré-requis : + +* Installation : +* VirtualBox>=4.0 +* Un serveur web +* php>=5.1.0 +* Utilisation : +* Firefox >= 3.6.0 +* Internet Explorer >= 8 +* Opera >= 10.0 +* Safari >= 4.0 +* Chrome/Chromium >= 5.0 + +### Configurer vboxwebservice + +Éditer le fichier `/etc/default/virtualbox` et y changer/ajouter la variable `VBOXWEB_USER=nom_utilisateur` par le nom d'un utilisateur qui lancera le service VBox et donc exécutera les VMs. +Ensuite il faut démarrer le service manuellement. + +~~~ +/etc/init.d/vboxweb-service start +~~~ + +Pour l'ajouter au démarrage de l'ordinateur de façon automatique, on peut utiliser la commande suivante : + +~~~ +update-rc.d vboxweb-service defaults +~~~ + +### Installer phpVirtualBox + + + 1. Télécharger la dernière version de phpVirtualBox sur le [site](http://code.google.com/p/phpvirtualbox/downloads/list) ; + 2. Décompresser l'archive, et copier le contenu dans un dossier de votre serveur web (ou à la racine) ; + 3. Renommer le fichier `config.php-example` en `config.php` et l'éditer avec les bon paramètres (login et mot de passe notamment) ; + 4. Accéder à l'URL de votre serveur web ; + 5. Connectez-vous à l'interface avec le login et mot de passe `admin/admin` diff --git a/HowtoWindows.md b/HowtoWindows.md new file mode 100644 index 00000000..7ac6d93a --- /dev/null +++ b/HowtoWindows.md @@ -0,0 +1,9 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Windows + +## Powershell + +tail -f FILE = Get-Content FILE -wait + +(attention, cela affiche tout le fichier) \ No newline at end of file diff --git a/HowtoWkhtmltopdf.md b/HowtoWkhtmltopdf.md new file mode 100644 index 00000000..d6ee3276 --- /dev/null +++ b/HowtoWkhtmltopdf.md @@ -0,0 +1,42 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## HowtoWkhtmltopdf + +Le logiciel wkhtmltopdf permet de convertir des fichiers html en pdf. + +Il est disponible dans les dépôts officiels de Debian mais les dépendances implique un serveur X. + +## Installation + +Pour l'installer sans serveur X, sur un serveur par exemple, il faut utiliser le paquet .deb fournit sur le site officiel. + +Ce paquet est fournit avec des librairies statiques et ne nécessite pas le lancement d'un serveur X. + +Télécharger le paquet sur puis : +~~~ +dpkg -i paquet.deb +~~~ +Résoudre les dépendances avec aptitude ou apt puis installer le paquet "libicu48". (aptitude ne l'installe pas par les dépendances du .deb) + +## Pixelization + +Si rendu devient pixelizé (en général sur la font par défaut), remplir le fichier de conf "no-bitmaps" correspondant à celui pointé par "/etc/fonts/conf.avail/70-no-bitmaps.conf". + +~~~ + + + + + + + + false + + + + +~~~ + +Ne pas oublier de rendre ce fichier en lecture pour tous. + +voir [] diff --git a/HowtoWordpress.md b/HowtoWordpress.md new file mode 100644 index 00000000..73f1fbee --- /dev/null +++ b/HowtoWordpress.md @@ -0,0 +1,147 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Wordpress + +# W3 Total Cache + +W3 Total Cache améliore les performances d'un « site/blog » propulsé par Wordpress ainsi que la rapidité du chargement des pages pour une meilleure expérience utilisateur et un meilleur référencement ! [[BR]] + +Pour cela W3 Total Cache met en cache différents éléments : renforcement du cache navigateur, cache des pages, des objets et des requêtes SQL. Il propose aussi différentes fonctions tel que le html/css/js minify et la gestion de CDN. + +## Installation + +### Prérequis + +* PHP 5.6 >= +* MySQL 5.6 >= +* Apache avec module rewrite + +### Procédure + +* Télécharger l'archive du plugin sur le site de [Wordpress](http://wordpress.org/extend/plugins/w3-total-cache/) et la décompresser dans wp-content/plugins. (Ou bien installer le plugin depuis Wordpress) ; +* Activer le plugins dans la liste des extensions Wordpress ; +* Passer à la configuration. + +## Configuration + +La configuration se passe dans le tableau de bord de Worpdress, dans l'onglet « Performance ». +Cliquer sur le bouton « Compatiblity Check », pour vérifier que votre serveur dispose de tous les modules nécessaire. + +# Mise à jour Wordpress par l'interface web via ssh + +Voir + +* Installer php5-ssh2 sous Squeeze ou libssh2-php en Wheezy +* Activer allow_url_fopen dans la configuration du vhost +* Lors de la mise à jour, choisir SSH2, spécifier 127.0.0.1 en serveur, le login et mot de passe adéquat + +Attention en wordpress 4.3, la mise à jour via ssh est cassée, il faut appliquer ce fix : + +# Mise à jour Wordpress [plugins] depuis l'interface web (éviter) + +Revoir les droits du groupe pour permettre l'écriture ($HOME/www = où le wp est installé) : +~~~ +$ chmod g+w $HOME/www/ $HOME/www/wp-includes/version.php +$ chmod g+w -R $HOME/www/wp-admin/includes/ $HOME/www/wp-content/ [$HOME/www/wp-content/upgrade/ $HOME/www/wp-content/languages/] +~~~ +Si vous avez des retours de type : 'Operation not permitted', il y a de bonne chance que le propriétaire du fichier soit déjà l'utilisateur utilisé par l'instance du serveur web (et donc les droits sont déjà suffisant). + +## Définir les droits des fichiers écrit par Wordpress + +Wordpress surcharge l'umask définie par Apache/PHP et écrit par défaut les fichiers et dossiers en 750. + +Il faut rajouter ces 2 lignes dans wp-config.php pour avoir des droits corrects : +~~~ +define( 'FS_CHMOD_DIR', ( 0770 & ~ umask() ) ); +define( 'FS_CHMOD_FILE', ( 0660 & ~ umask() ) ); +~~~ + +## Attaque sur xmlrpc.php + +Sur les Wordpress pas à jour, l'API xmlrpc.php est sensible à une attaque par rebond, un attaquant réalise plein de requêtes sur xmlrpc.php et votre serveur fait des requêtes vers la/les cibles de l'attaquant. + +S'il ne vous est pas possible de mettre à jour Wordpress, une solution est de bloquer les requêtes vers xmlrpc.php dans Apache : +~~~ + +Deny from all + +~~~ + +# wp-cli + +[] + +## core + +Vérifier que le répertoire en question correspond bien à un wordpress : +~~~ +php wp-cli.phar core is-installed --path=$HOME/www +~~~ + +### Installation + +Configuration des différentes directives à compléter (pour la base de donnée) : +~~~ +php wp-cli.phar core config --dbname=nombase --dbuser=nomutilisateur --dbpass=motdepasse \ +--dbhost=hostnamedb --path=$HOME/www +~~~ +Procéder à l'installation : +~~~ +php wp-cli.phar core install --url="ServerName" --title="TITRE_WP" --admin_user="admin" --admin_password="motdepasseadmin" \ +--admin_email="emailadmin" --skip-email --path="$HOME/www" +~~~ + +### Mise à jour + +Se placer dans le répertoire où est installé wp : +~~~ +$ cd $HOME/www +~~~ + +Forcer le téléchargement de la dernière version (US) - non recommandé: +~~~ +$ php $HOME/wp-cli/wp-cli.phar core download --force +~~~ + +Vérifier si maj disponible : +~~~ +$ php $HOME/wp-cli/wp-cli.phar core check-update ++---------+-------------+-------------------------------------------------------------+ +| version | update_type | package_url | ++---------+-------------+-------------------------------------------------------------+ +| 4.6.1 | major | | ++---------+-------------+-------------------------------------------------------------+ +~~~ + +Mettre à jour wordpress et la bd +~~~ +$ php $HOME/wp-cli/wp-cli.phar core update +Updating to version 4.6.1 (en_US)... +Downloading update from +Unpacking the update... +Cleaning up files... +No files found that need cleaned up. +Success: WordPress updated successfully. +$ php $HOME/wp-cli/wp-cli.phar core update-db +Success: WordPress database upgraded successfully from db version 36686 to 37965. +~~~ + +### Utilisateurs + +Créer un utilisateur admin : +~~~ +$ php $HOME/wp-cli/wp-cli.phar user create admintest john@example.com --role=administrator +Success: Created user 3. +Password: XXXXXXX +~~~ + +Si temporaire, ne pas oublier de le supprimer : +~~~ +$ php $HOME/wp-cli/wp-cli.phar user list ++----+------------+---------------+----------------------+----------------------+---------------+ +| ID | user_login | display_name | user_email | user_registered | roles | ++----+------------+---------------+----------------------+----------------------+---------------+ +| X | admintest | admintest | johndoe@example.com | 2016-10-17 17:40:26 | administrator | + +$ php $HOME/wp-cli/wp-cli.phar user delete X +~~~ diff --git a/HowtoXen.md b/HowtoXen.md new file mode 100644 index 00000000..edc167f9 --- /dev/null +++ b/HowtoXen.md @@ -0,0 +1,137 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Xen + + + +## dom0 + +~~~ +# aptitude install xen-tools xen-hypervisor-3.0.3-1-amd64 +xen-linux-system-2.6.18-6-xen-amd64 bridge-utils +~~~ + +## domU + +### Préparer les "images" des partitions + +~~~ +# dd if=/dev/zero of=debian.img bs=1 count=0 seek=8G +# mkfs.ext3 debian.img +# dd if=/dev/zero of=debian_swap.img bs=1M count=50 +# mkswap debian_swap.img +~~~ + +Note : on pourra aussi gérer les partitions directement en LVM + +### Installation du système de base + +On monte la (ou les) partitions en local. Dans le cas d'une image : + +~~~ +# mkdir /mnt/xen +# mount -o loop debian.img /mnt/xen/ +~~~ + +Puis on deboostrap : + +~~~ +# debootstrap squeeze /mnt/xen +~~~ + +Et enfin, on réalise les opérations de base : + +~~~ +# mount -t proc /proc/ /mnt/xen/proc/ +# sudo chroot /mnt/xen /bin/bash +# passwd +# dpkg-reconfigure tzdata +# aptitude install linux-image-2.6.32-5-xen-amd64_2.6.32-30_amd64.deb +# hostname +~~~ + +On ajuste le fichier _/etc/fstab_ : + +~~~ +/dev/xvda1 / ext3 errors=remount-ro 0 1 +proc /proc proc rw,nodev,nosuid,noexec 0 0 +/dev/xvda2 none swap sw 0 0 +~~~ + +Le fichier _/etc/network/interfaces_ : + +~~~ +auto lo +iface lo inet loopback + +auto eth0 +iface eth0 inet static + address IP + netmask MASQUE + gateway ROUTEUR + # post-up ethtool -K eth0 tx off +~~~ + +Le fichier _/etc/hosts_ + +Le fichier _/etc/hostname_ + + +Et enfin, il faudra aussi modifier le fichier _/etc/inittab_ ainsi : + +~~~ +#1:2345:respawn:/sbin/getty 38400 tty1 +1:2345:respawn:/sbin/getty 38400 hvc0 +~~~ + +Attention, à la fin, ne pas oublier de démonter toutes les partitions !!! + +~~~ +# exit +# sudo umount /mnt/xen/proc +# sudo umount /mnt/xen +~~~ + + + +### Configuration de la machine virtuelle + +On configure la machine virtuelle/etc/xen/debian : + +~~~ +kernel = "/boot/vmlinuz-2.6.32-5-xen-amd64" +ramdisk = '/boot/initrd.img-2.6.32-5-xen-amd64' +memory = 128 +name = "debian" +root = "/dev/xvda1 ro" +disk = [ 'file:/srv/xen/debian.img,xvda1,w' ] +vif = [ '' ] +~~~ + + +Creation/démarrage du domU (option -c => attacher le système) + +~~~ +# xm create debian +~~~ + +On pourra utiliser l'option _-c_ pour voir directement le système démarrer + +S'attacher à un terminal : + +~~~ +# xm console debian +~~~ + +Sortir : +~~~ +Ctrl+AltGr+] +~~~ + +Pour que la machine virtuelle démarre automatiquement lors d'un démarrage du dom0 : + +~~~ +# mkdir -p /etc/xen/auto +# cd /etc/xen/auto +# ln -s ../debian debian +~~~ diff --git a/HowtoXrandr.md b/HowtoXrandr.md new file mode 100644 index 00000000..26fbedfb --- /dev/null +++ b/HowtoXrandr.md @@ -0,0 +1,18 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Xrandr + +xrand -q + +xrandr --output VGA1 --auto +xrandr --output VGA1 --off + +xrandr --output LVDS1 --mode 1024x768 + +xrandr --output HDMI2 --right-of HDMI1 + +xrandr --output HDMI3 --mode 1440x900 --rotate left +xrandr --output HDMI1 --mode 2560x1080 --left-of HDMI3 + +ssh HOSTNAME xrandr -display :0.0 -q + diff --git a/HowtoYUM.md b/HowtoYUM.md new file mode 100644 index 00000000..73b4deea --- /dev/null +++ b/HowtoYUM.md @@ -0,0 +1,31 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto YUM + +Installation : + +~~~ +# yum install +~~~ + +Mise-à-jour : + +~~~ +# yum update +# yum upgrade +~~~ + +Vider le cache : + +~~~ +# yum clean all +Loaded plugins: rhnplugin +Cleaning up Everything +~~~ + +Installer un paquet en désactivant un repo (pour prendre le paquet que dans le dépot souhaité) + +~~~ +yum repolist +yum install nom_du_paquet --disablerepo=epel +~~~ \ No newline at end of file diff --git a/HowtoZFS.md b/HowtoZFS.md new file mode 100644 index 00000000..0b9081d7 --- /dev/null +++ b/HowtoZFS.md @@ -0,0 +1,253 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto ZFS + +Les exemples donnés ici n'ont été testés sur OpenIndiana et Solaris, bien qu'ils soient probablement applicables à FreeBSD voir Linux, ils peuvent présenter de grosses différences dans le support de fonctionnalités spécifiques ou du montage automatique ! + +ZFS est le système de fichiers par défaut de Solaris et OpenIndiana, il regroupe à lui seul les outils de différents niveaux habituellement utilisés pour gérer le stockage tels LVM pour le découpage logique, mdadm pour la gestion du raid, et ext3/4 pour le filesystem en lui même. + +Tout commence avec le zpool, qui est la première unité de gestion de disques avec ZFS, un zpool peut être composé d'un ou plusieurs disques, avec ou sans gestion de parité, et même avec ou sans cache séparé. +Viennent ensuite les volumes, qui sont découpés dans un zpool, et qui constituent un équivalent des partitions. Attention, par défaut un zpool est parfaitement utilisable comme un gros volume, mais rien n’empêche de le (re)découper par la suite, de la même manière un volume peut très bien être créé en tant que block device afin d'être partagé en iSCSI par exemple. + +||*zpool*||*zfs*|| +||RAID||Ext3/4|| +||LVM||img|| + +## Zpool(s) + +### Création + +Créer un zpool simple (sur un disque nouvellement ajouté par exemple) : + +~~~ +# cfgadm +Ap_Id Type Receptacle Occupant Condition +sata6/0::dsk/c3t0d0 disk connected configured ok +sata6/1::dsk/c3t1d0 cd/dvd connected configured ok +sata6/2::dsk/c3t2d0 disk connected configured ok +[...] +~~~ + +~~~ +# zpool create test1 c3t2d0 +# zpool list +NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT +rpool 7,94G 3,25G 4,69G 40% 1.00x ONLINE - +test1 49,8G 114K 49,7G 0% 1.00x ONLINE - +~~~ + +Créer un zpool avec plusieurs disques (équivalent d'un RAID0) : + +~~~ +# zpool create test2 c3t3d0 c3t4d0 +'test2' successfully created, but with no redundancy; failure of one +device will cause loss of the pool +# zpool list +NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT +rpool 7,94G 3,24G 4,69G 40% 1.00x ONLINE - +test1 49,8G 86,5K 49,7G 0% 1.00x ONLINE - +test2 99,5G 127K 99,5G 0% 1.00x ONLINE - +~~~ + +Créer un zpool en RAID-Z (équivalent d'un RAID5) : + +~~~ +# zpool destroy test2 +# zpool destroy test1 +# zpool create test raidz c3t2d0 c3t3d0 c3t4d0 +# zpool list +NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT +rpool 7,94G 3,26G 4,68G 41% 1.00x ONLINE - +test 149G 253K 149G 0% 1.00x ONLINE - +~~~ + +Dans ce cas, la parité est conservée une seule fois, mais il est possible de choisir d'utiliser un parité double ou triple en ayant un minimum de 4 ou 5 disques et en remplaçant _raidz_ par respectivement _raidz2_ ou _raidz3_. + +Pour obtenir les détails sur l'état d'un zpool (qu'il s'agisse d'un raidz, ou d'un mirroir, ou encore d'un stripping sans parité) : + +~~~ +# zpool status test + pool: test + state: ONLINE + scan: none requested +config: + + NAME STATE READ WRITE CKSUM + test ONLINE 0 0 0 + raidz1-0 ONLINE 0 0 0 + c3t2d0 ONLINE 0 0 0 + c3t3d0 ONLINE 0 0 0 + c3t4d0 ONLINE 0 0 0 + +errors: No known data errors +~~~ + +Les zpool créés localement sont montés par défaut sur la racine, pour changer ce comportement, il faut préciser le point de montage par défaut avec l'option _-m_ après le _create_ : + +~~~ +# zpool create -m /export/test test raidz c3t2d0 c3t3d0 c3t4d0 +# df -h +[...] +test 98G 34K 98G 1% /export/test +~~~ + +Il est à noter que les zpools sont également persistants, et sont (re)montés automatiquement au démarrage. + +### Ajout de disques à un zpool + +À compléter + +### Désignation des disques de spare dans un zpool + +~~~ +# zpool add test spare c3t5d0 +# zpool status test + pool: test + state: ONLINE + scan: none requested +config: + + NAME STATE READ WRITE CKSUM + test ONLINE 0 0 0 + raidz1-0 ONLINE 0 0 0 + c3t2d0 ONLINE 0 0 0 + c3t3d0 ONLINE 0 0 0 + c3t4d0 ONLINE 0 0 0 + spares + c3t5d0 AVAIL + +errors: No known data errors +~~~ + +Dès lors qu'un disque du pool est en défaut, tout se déroule automatiquement : + +~~~ +# zpool status test + pool: test + state: ONLINE +status: One or more devices is currently being resilvered. The pool will + continue to function, possibly in a degraded state. +action: Wait for the resilver to complete. + scan: resilver in progress since Fri Apr 20 17:11:19 2012 + 154M scanned out of 309M at 3,28M/s, 0h0m to go + 51,2M resilvered, 49,86% done +config: + + NAME STATE READ WRITE CKSUM + test ONLINE 0 0 0 + raidz1-0 ONLINE 0 0 0 + c3t2d0 ONLINE 0 0 0 + spare-1 ONLINE 0 0 0 + c3t3d0 UNAVAIL 0 0 0 corrupted data + c3t5d0 ONLINE 0 0 0 (resilvering) + c3t4d0 ONLINE 0 0 0 + spares + c3t5d0 INUSE currently in use + +errors: No known data errors +~~~ + +### Remplacement d'un disque + +Dans le cas précédent, un disque était en défaut, il a été remplacé par un disque de spare, mais il ne faut pas tarder à remplacer le disque défectueux afin d'éviter toute défaillance en cascade. + +Le disque c3t3d0, vient d'être remplacé par un disque neuf : + +~~~ +# zpool replace test c3t3d0 +# zpool status test + pool: test + state: ONLINE + scan: resilvered 103M in 0h0m with 0 errors on Fri Apr 20 17:23:08 2012 +config: + + NAME STATE READ WRITE CKSUM + test ONLINE 0 0 0 + raidz1-0 ONLINE 0 0 0 + c3t2d0 ONLINE 0 0 0 + c3t3d0 ONLINE 0 0 0 + c3t4d0 ONLINE 0 0 0 + spares + c3t5d0 AVAIL + +errors: No known data errors +~~~ + +Si le disque n'avait pas été remplacé physiquement, mais qu'un autre disque était utilisable sur le serveur une autre solution aurait été de le remplacer par ce dernier : + +~~~ +# zpool replace test c3t3d0 c3t6d0 +# zpool status test + pool: test + state: ONLINE + scan: resilvered 103M in 0h1m with 0 errors on Fri Apr 20 20:33:44 2012 +config: + + NAME STATE READ WRITE CKSUM + test ONLINE 0 0 0 + raidz1-0 ONLINE 0 0 0 + c3t2d0 ONLINE 0 0 0 + c3t6d0 ONLINE 0 0 0 + c3t4d0 ONLINE 0 0 0 + spares + c3t5d0 AVAIL + +errors: No known data errors +~~~ + +Les deux commandes précédentes affichent un état de la reconstruction tant que l'opération n'est pas terminée. + +### Réparation d'un zpool en défaut + +À compléter + +### Utilisation de disques de cache + +À compléter + +## Volumes ZFS + +### Création + +Créer un filesystem ZFS dans le zpool _test_ : + +~~~ +zfs create test/zfs +~~~ + +Créer un volume de type "block" (pour le partager en iSCSI, ou pour utiliser un autre système de fichiers dessus) dans le zpool _test_ : + +~~~ +# zfs create -V 90g test/iscsi +# zfs list +[...] +test 93,3G 4,43G 427M /export/test +test/iscsi 92,8G 97,3G 16,7K - +~~~ + +### Partage en réseau + +#### NFS + +À compléter + +#### SMB + +À compléter + +### Synchronisation de volumes/pools + +Sychroniser filer1:zpool/vol1 vers filer2:zpool/vol2: + +~~~ +# Premiere synchro seulement: +filer1# zfs snapshot -r zpool/vol1@sync1 # -r = recursif +filer1# zfs send -R zpool/vol1@sync1 | ssh filer2 'zfs receive -F zpool/vol2' + +# synchro incrémentale suivante: +filer1# zfs snapshot -r zpool/vol1@sync2 +filer1# zfs send -R -I @sync1 zpool/vol1@sync2 | ssh filer2 'zfs receive -F zpool/vol2' +~~~ + +Attention: receive -F écrase la destination, et send -R envoie *tout* (points de montages, destruction/creation de sous volumes, snapshots, ...) + diff --git a/HowtoZimbra.md b/HowtoZimbra.md new file mode 100644 index 00000000..aec5369d --- /dev/null +++ b/HowtoZimbra.md @@ -0,0 +1,1475 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Zimbra + +Zimbra est un logiciel de messagerie et de Groupware (gestion des agendas, carnets d'adresses, etc.). +Il possède une interface web (versions AJAX, HTML ou mobile), une version riche (Zimbra Desktop), une synchronisation Activesync pour les mobiles (iPhone, Android, Windows Phone, Nokia) et un plugin pour Microsoft Outlook (>=2003). +Il existe en version NETWORK EDITION (version propriétaire nécessitant des licences payantes) et OPENSOURCE (version gratuite mais avec les fonctionnalités en moins comme la synchronisation Activesync et le plugin pour Microsoft Outlook). + + +## Comprendre les licences Zimbra + +Zimbra a été racheté successivement par Yahoo, VMware, Telligent puis Synacor. +C'est l'une des raisons pour laquelle le système de licences a souvent changé et qu'il est difficile à comprendre. + +La licence conseillée est la PROFESSIONNAL car elle inclut les fonctionnalités intéressantes comme la synchronisation Activesync et le plugin pour Microsoft Outlook, voir +Cela inclut notamment un support STANDARD : par le portail et par téléphone en heures ouvrées, voir + +Pour acheter des licences, vous devez passer par un revendeur comme STARXPERT ou SCC, qui passe lui-même par COMMEO (revendeur officiel). + +En terme de tarif, comptez environ 20 EUR/ compte/ an pour la licence PROFESSIONNAL (la quantité minimale étant de 25), voir + +Attention, méfiez-vous de la licence perpétuelle qui n'inclut pas les mises à jour majeures de Zimbra ! + +## Installation + +Prérequis : + +* Avoir au moins 2 Go de RAM. +* Avoir un _/etc/hosts_ propre, contenant par exemple (avec zimbra.example.com résolvant vraiment vers 192.0.32.10) : +~~~ +127.0.0.1 localhost.localdomain localhost +192.0.32.10 zimbra.example.com zimbra +~~~ + +Installation de Zimbra 8 sous [wiki:Ubuntu] 14.04 LTS 64bits : + +~~~ +# aptitude remove lsb-invalid-mta +# aptitude install libgmp10 libperl5.18 libaio1 unzip resolvconf +$ wget +$ tar xvf zcs-NETWORK-8.6.0_GA_1153.UBUNTU14_64.20141215151218.tgz +~~~ + +~~~ +# cd zcs-NETWORK-8.6.0_GA_1153.UBUNTU14_64.20141215151218 +# ./install.sh +Operations logged to /tmp/install.log.4467 +Checking for existing installation... + zimbra-ldap...NOT FOUND + zimbra-logger...NOT FOUND + zimbra-mta...NOT FOUND + zimbra-snmp...NOT FOUND + zimbra-store...NOT FOUND + zimbra-apache...NOT FOUND + zimbra-spell...NOT FOUND + zimbra-convertd...NOT FOUND + zimbra-memcached...NOT FOUND + zimbra-proxy...NOT FOUND + zimbra-archiving...NOT FOUND + zimbra-cluster...NOT FOUND + zimbra-core...NOT FOUND + +VMWARE END USER LICENSE AGREEMENT + +IMPORTANT-READ CAREFULLY: BY DOWNLOADING, INSTALLING, OR USING THE +[...] +Do you agree with the terms of the software license agreement? [N] y + +Checking for prerequisites... + FOUND: NPTL + FOUND: netcat-openbsd-1.89-4ubuntu1 + FOUND: sudo-1.8.3p1-1ubuntu3.4 + FOUND: libidn11-1.23-2 + FOUND: libpcre3-8.12-4 + FOUND: libgmp3c2-2:4.3.2+dfsg-2ubuntu1 + FOUND: libexpat1-2.0.1-7.2ubuntu1.1 + FOUND: libstdc++6-4.6.3-1ubuntu5 + FOUND: libperl5.14-5.14.2-6ubuntu2.3 + +Checking for suggested prerequisites... + FOUND: pax + FOUND: perl-5.14.2 + FOUND: sysstat + FOUND: sqlite3 +Prerequisite check complete. + +Checking for installable packages + +Found zimbra-core +Found zimbra-ldap +Found zimbra-logger +Found zimbra-mta +Found zimbra-snmp +Found zimbra-store +Found zimbra-apache +Found zimbra-spell +Found zimbra-convertd +Found zimbra-memcached +Found zimbra-proxy +Found zimbra-archiving + + +Select the packages to install + +Install zimbra-ldap [Y] +Install zimbra-logger [Y] +Install zimbra-mta [Y] +Install zimbra-snmp [Y] +Install zimbra-store [Y] +Install zimbra-apache [Y] +Install zimbra-spell [Y] +Install zimbra-convertd [Y] +Install zimbra-memcached [N] +Install zimbra-proxy [N] +Install zimbra-archiving [N] + +Checking required space for zimbra-core +checking space for zimbra-store + +Installing: + zimbra-core + zimbra-ldap + zimbra-logger + zimbra-mta + zimbra-snmp + zimbra-store + zimbra-apache + zimbra-spell + zimbra-convertd + +The system will be modified. Continue? [N] y + +Removing /opt/zimbra +Removing zimbra crontab entry...done. +Cleaning up zimbra init scripts...done. +Cleaning up /etc/ld.so.conf...done. +Cleaning up /etc/security/limits.conf...done. + +Finished removing Zimbra Collaboration Suite. + +Installing packages + + zimbra-core......zimbra-core_7.0.0_GA_3077.UBUNTU10_64_amd64.deb...done + zimbra-ldap......zimbra-ldap_7.0.0_GA_3077.UBUNTU10_64_amd64.deb...done + zimbra-logger......zimbra-logger_7.0.0_GA_3077.UBUNTU10_64_amd64.deb...done + zimbra-mta......zimbra-mta_7.0.0_GA_3077.UBUNTU10_64_amd64.deb...done + zimbra-snmp......zimbra-snmp_7.0.0_GA_3077.UBUNTU10_64_amd64.deb...done + zimbra-store......zimbra-store_7.0.0_GA_3077.UBUNTU10_64_amd64.deb...done + zimbra-apache......zimbra-apache_7.0.0_GA_3077.UBUNTU10_64_amd64.deb...done + zimbra-spell......zimbra-spell_7.0.0_GA_3077.UBUNTU10_64_amd64.deb...done + zimbra-convertd......zimbra-convertd_7.0.0_GA_3077.UBUNTU10_64_amd64.deb...done + +Operations logged to /tmp/zmsetup.03012011-104432.log +Installing LDAP configuration database...done. + +DNS ERROR resolving MX for zimbra.example.com +It is suggested that the domain name have an MX record configured in DNS +Change domain name? [Yes] No +done. +Checking for port conflicts +Main menu + + 1) Common Configuration: + 2) zimbra-ldap: Enabled + 3) zimbra-store: Enabled + +Create Admin User: yes + +Admin user to create: admin@zimbra.example.com +******* +Admin Password UNSET + +Anti-virus quarantine user: virus-quarantine.tqiruegf6wsr88vv@zimbra.example.com + +Enable automated spam training: yes + +Spam training user: spam.qrs78szfr87wr@zimbra.example.com + +Non-spam(Ham) training user: ham.xagwfg7g37jkk@zimbra.example.com + +SMTP host: zimbra.example.com + +Web server HTTP port: 80 + +Web server HTTPS port: 443 + +Web server mode: http + +IMAP server port: 143 + +IMAP server SSL port: 993 + +POP server port: 110 + +POP server SSL port: 995 + +Use spell check server: yes + +Spell server URL: + +Configure for use with mail proxy: FALSE + +Configure for use with web proxy: FALSE + +Enable version update checks: TRUE + +Enable version update notifications: TRUE + +Version update notification email: admin@zimbra.example.com + +Version update source email: admin@zimbra.example.com +******* +License filename: UNSET + + 4) zimbra-mta: Enabled + 5) zimbra-snmp: Enabled + 6) zimbra-logger: Enabled + 7) zimbra-spell: Enabled + 8) zimbra-convertd: Enabled + 9) Default Class of Service Configuration: + 10) Enable default backup schedule: yes + r) Start servers after configuration yes + s) Save config to file + x) Expand menu + q) Quit + +Address unconfigured (**) items (? - help) +[...] +~~~ + +Il vous reste au minimum à configurer le mot de passe admin +et à contacter votre revendeur pour acheter des licences Zimbra. + +~~~ +*** CONFIGURATION COMPLETE - press 'a' to apply +Select from menu, or press 'a' to apply config (? - help) a +Save configuration data to a file? [Yes] +Save config in file: [/opt/zimbra/config.11297] +Saving config in /opt/zimbra/config.11297...done. +The system will be modified - continue? [No] yes +Operations logged to /tmp/zmsetup.03012011-104432.log +Setting local config values...done. +Setting up CA...done. +Deploying CA to /opt/zimbra/conf/ca ...done. +Creating SSL certificate...done. +Installing mailboxd SSL certificates...done. +Initializing ldap...done. +Setting replication password...done. +Setting Postfix password...done. +Setting amavis password...done. +Setting nginx password...done. +Creating server entry for zimbra.example.com...done. +Saving CA in ldap ...done. +Saving SSL Certificate in ldap ...done. +Setting spell check URL...done. +Setting service ports on zimbra.example.com...done. +Adding zimbra.example.com to zimbraMailHostPool in default COS...done. +Installing webclient skins... + lake...done. + lemongrass...done. + carbon...done. + tree...done. + steel...done. + waves...done. + bare...done. + pebble...done. + hotrod...done. + oasis...done. + twilight...done. + lavender...done. + bones...done. + sky...done. + beach...done. + smoke...done. + sand...done. +Finished installing webclient skins. +Setting zimbraFeatureTasksEnabled=TRUE...done. +Setting zimbraFeatureBriefcasesEnabled=TRUE...done. +Setting convertd URL...done. +Setting MTA auth host...done. +Setting TimeZone Preference...done. +Initializing mta config...done. +Setting services on zimbra.example.com...done. +Creating domain zimbra.example.com...done. +Setting default domain name...done. +Setting up default domain admin UI components..done. +Granting group zimbraDomainAdmins@zimbra.example.com domain right +domainAdminConsoleRights on zimbra.example.com...done. +Granting group zimbraDomainAdmins@zimbra.example.com global right +domainAdminZimletRights...done. +Setting up global distribution list admin UI components..done. +Granting group zimbraDLAdmins@zimbra.example.com global right +adminConsoleDLRights...done. +Granting group zimbraDLAdmins@zimbra.example.com global right +listAccount...done. +Creating domain zimbra.example.com...already exists. +Creating admin account admin@zimbra.example.com...done. +Creating root alias...done. +Creating postmaster alias...done. +Creating user spam.r4nd0m@zimbra.example.com... +done. +Creating user ham.r4nd0m@zimbra.example.com... +done. +Creating user virus-quarantine.r4nd0m@zimbra.example.com... +done. +Setting spam training and Anti-virus quarantine accounts...done. +Initializing store sql database...done. +Setting zimbraSmtpHostname for zimbra.example.com...done. +Configuring SNMP...done. +Checking for default IM conference room...not present. +Initializing default IM conference room...done. +Setting up syslog.conf...done. +Setting default backup schedule...Done +Looking for valid license to install...license installed. +Starting servers...done. +Installing common zimlets... + com_zimbra_srchhighlighter...done. + com_zimbra_cert_manager...done. + com_zimbra_attachmail...done. + com_zimbra_social...done. + com_zimbra_attachcontacts...done. + com_zimbra_phone...done. + com_zimbra_bulkprovision...done. + com_zimbra_webex...done. + com_zimbra_linkedin...done. + com_zimbra_url...done. + com_zimbra_email...done. + com_zimbra_date...done. + com_zimbra_dnd...done. + com_zimbra_adminversioncheck...done. +Finished installing common zimlets. +Installing network zimlets... + com_zimbra_backuprestore...done. + com_zimbra_license...done. + com_zimbra_mobilesync...done. + com_zimbra_hsm...done. + com_zimbra_delegatedadmin...done. + com_zimbra_convertd...done. +Finished installing network zimlets. +Restarting mailboxd...done. +Setting up zimbra crontab...done. + +Moving /tmp/zmsetup.03012011-104432.log to /opt/zimbra/log +~~~ + +## Configuration + +Activer HTTPS en plus de HTTP : + +~~~ +# su zimbra +zimbra$ /opt/zimbra/bin/zmtlsctl redirect +Setting ldap config zimbraMailMode redirect for zimbra.example.com...done. +Rewriting config files for cyrus-sasl, webxml and mailboxd...done. +# /etc/init.d/zimbra restart +Host zimbra.example.com + Stopping stats...Done. + Stopping mta...Done. + Stopping spell...Done. + Stopping snmp...Done. + Stopping cbpolicyd...Done. + Stopping archiving...Done. + Stopping antivirus...Done. + Stopping antispam...Done. + Stopping imapproxy...Done. + Stopping memcached...Done. + Stopping mailbox...Done. + Stopping convertd...Done. + Stopping logger...Done. + Stopping zmconfigd...Done. + Stopping ldap...Done. +Host zimbra.example.com + Starting ldap...Done. + Starting zmconfigd...Done. + Starting logger...Done. + Starting convertd...Done. + Starting mailbox...Done. + Starting antispam...Done. + Starting antivirus...Done. + Starting snmp...Done. + Starting spell...Done. + Starting mta...Done. + Starting stats...Done. +~~~ + +Pour autoriser un certificat non reconnu par Sun/Java (par exemple pour accéder à un annuaire extérieur en LDAP pour la GAL), +on suivra les instructions décrites sur : + +~~~ +$ wget +$ /opt/zimbra/jdk1.6.0_22/bin/javac InstallCert.java +$ /opt/zimbra/jdk1.6.0_22/bin/java InstallCert secure.example.com +# cp jssecacerts /opt/zimbra/jdk1.6.0_22/jre/lib/security/ +# /etc/init.d/zimbra restart +~~~ + +## Administration + +### Via l'interface web + +Accessible sur le port 7071 : + ssh -L 7071:127.0.0.1:7071 zimbra.example.com + + +### En ligne de commande avec ZMPROV + + + +~~~ +# su zimbra +$ export PATH=$PATH:/opt/zimbra/bin + +Get all conf / global settings +$ zmprov gacf +Get domain +$ zmprov gd +Get account +$ zmprov ga +Get default COS +$ zmprov gc default +Get COS +$ zmprov gc +Modify global conf +$ zmprov mcf +Modify domain +$ zmprov md +Modify account +$ zmprov ma + +Search GAL +$ zmprov sg +~~~ + +Voici ainsi l'application de certaines modifications via la COS : + +~~~ +Commencer la semaine ouvrée le lundi +$ zmprov mc zimbraPrefCalendarFirstDayOfWeek 1 +Définir les horaires ouvrés de 9h à 18h +$ zmprov mc zimbraPrefCalendarWorkingHours 1:N:0900:1800,2:Y:0900:1800,3:Y:0900:1800,4:Y:0900:1800,5:Y:0900:1800,6:Y:0900:1800,7:N:0900:1800 +Afficher les numéros de semaine dans le mini-calendrier +$ zmprov mc zimbraPrefShowCalendarWeek TRUE +Ne PAS afficher les rappels pour les réunions dont la date est dépassée +$ zmprov mc zimbraPrefCalendarShowPastDueReminders FALSE +Autoriser la visualisation disponible/occupés uniquement pour les utilisateurs internes +zmprov mc zimbraACE "00000000-0000-0000-0000-000000000000 all viewFreeBusy" +Ne pas autoriser l'ajout automatique d'une invitation +zmprov mc zimbraPrefCalendarAutoAddInvites FALSE +~~~ + +D'autres modifications : + +~~~ +Renvoyer une notification lors d'un nouveau message à l'adresse +$ zmprov ma zimbraPrefNewMailNotificationAddress +Envoyer les alertes pour les rendez-vous de calendrier à +$ zmprov ma zimbraPrefCalendarReminderEmail +~~~ + +## GAL + + + +La GAL (Global Access List) est une liste de contacts globale. Elle est accessible a priori par tous les comptes d'un domaine, +elle comprend généralement les comptes eux-même et elle est utilisée pour les complétions. Sur les périphériques de type Mobile +(iPhone et Android), elle est accessible d'une façon différente des contacts classiques via "Annuaire d'entreprise". + +La GAL pourra être interne (associé à un compte dédié...) ou externe (synchronisation avec un annuaire LDAP). + +### GAL interne + +Dans le cas d'une GAL interne, il faut absolument utiliser un compte dédié (oui, vous avez bien lu, cela comptera pour une licence), souvent _galsync@_. +En configurant la GAL interne, cela crée d'ailleurs le compte automatiquement et l'associé à une _Datasource_... et il n'est pas possible de le changer après sauf +en passant en ligne de commande. Imaginons que vous changez le compte et la _Datasource_ associé, vous pouvez : + +1. Supprimer le compte _galsync@example.com_ (attention, Zimbra va râler quand vous irez dans la configuration de la GAL. + +2. Forcer le changement des paramètres de la GAL via : + +~~~ +$ zmgsautil createAccount -a galsync@example.com -n exampleGAL --domain example.com -t zimbra -p 1d +$ zmgsautil fullSync -a galsync@example.com -n exampleGAL +~~~ + +3. Dédoublonner le paramètre _zimbraGalAccountId_ : + +~~~ +$ zmprov gd example.com zimbraGalAccountId +$ zmprov md example.com zimbraGalAccountId 822bac1a-5e92-48a0-8bb0-xxxxxxx +~~~ + + +### GAL externe + +Dans le cas d'un GAL externe, il "suffit" de configurer la bonne connexion au serveur LDAP. +La plupart du temps, une GAL externe sera en lecture seule. + +Note : à voir l'intérêt d'utiliser un compte dédié dans ce cas ?? + +## Configuration + +### Postfix + +Non seulement Postfix est inclus dans le "bundle Zimbra", mais sa configuration est directement géré par Zimbra. Ainsi vous nous pouvez *pas* modifier le _main.cf_ +car il est regénéré en permanence. Imaginons que vous souhaitez rajouter une source _virtual_alias_maps_, la bonne façon pour faire une modification est d'utilisation +la commande suivante : + +Sous Zimbra 7 : + +~~~ +$ zmlocalconfig -e postfix_virtual_alias_maps='hash:/etc/zimbra-aliases,proxy:ldap:${zimbra_home}/conf/ldap-vam.cf' +$ postfix reload +~~~ + +Sous Zimbra 8 : + +~~~ +# /opt/zimbra/postfix-2.11.1.2z/sbin/postmap lmdb:/etc/zimbra-alias +$ zmprov -r -m -l ms z.example.com zimbraMtaVirtualAliasMaps 'lmdb:/etc/zimbra-alias,proxy:ldap:/opt/zimbra/conf/ldap-vam.cf' +$ zmmtactl restart +~~~ + +Voyez également le fichier _/opt/zimbra/conf/zmmta.cf_ qui sert dans le processus de génération automatique de la configuration de Postfix. + +ATTENTION, sous Zimbra 8.6, l'algorithme hash n'est plus supporté : _unsupported dictionary type: hash_ +Vous devez utiliser 'lmdb' et utiliser /opt/zimbra/postfix-2.11.1.2z/sbin/postmap lmdb: pour générer les .lmdb + + +## Administration + +Tester le bon fonctionnement des services : + +~~~ +$ zmcontrol status +Host zimbra.example.com + antispam Running + antivirus Running + convertd Running + ldap Running + logger Running + mailbox Running + mta Running + snmp Running + spell Running + stats Running + zmconfigd Running +~~~ + +### Stockage des mails + +Zimbra ne stocke malheureusement pas les mails de façon standard : pas de Maildir, de mbox, etc. :( + +Il indexe les messages dans MySQL et les stocke dans des répertoires sous _/opt/zimbra/store_ : + +~~~ +mysql> select * from zimbra.volume; ++----+------+----------+-------------------+-----------+-----------------+--------------+--------------------+----------------+-----------------------+ +| id | type | name | path | file_bits | file_group_bits | mailbox_bits | mailbox_group_bits | compress_blobs | compression_threshold | ++----+------+----------+-------------------+-----------+-----------------+--------------+--------------------+----------------+-----------------------+ +| 1 | 1 | message1 | /opt/zimbra/store | 12 | 8 | 12 | 8 | 0 | 4096 | +| 2 | 10 | index1 | /opt/zimbra/index | 12 | 8 | 12 | 8 | 0 | 4096 | ++----+------+----------+-------------------+-----------+-----------------+--------------+--------------------+----------------+-----------------------+ +2 rows in set (0.00 sec) + +mysql> select * from mboxgroup12.mail_item limit 1 offset 250\G +*************************** 1. row *************************** + mailbox_id: 12 + id: 756 + type: 5 + parent_id: 753 + folder_id: 3 + index_id: 756 + imap_id: 756 + date: 1301526232 + size: 1760 + volume_id: 1 + blob_digest: Cv6LEbNCmYaEQXLTY4Pc05f37BB= + unread: 0 + flags: 0 + tags: 0 + sender: John Doe + subject: test + name: NULL + metadata: d1:f0:1:s37:jdoe@example.com (John Doe)1:ve31ff +mod_metadata: 1617 + change_date: 1301527020 + mod_content: 1610 +1 row in set (0.00 sec) +~~~ + +Voir + +Gestion des volumes avec _zmvolume_, qui permet de lister les volumes +et leurs propriétés, les changer : + +~~~ +$ zmvolume -l + Volume id: 1 + name: message1 + type: primaryMessage + path: /opt/zimbra/store + compressed: false + current: true + + Volume id: 2 + name: index1 + type: index + path: /opt/zimbra/index + compressed: false + current: true + +$ zmvolume -e -id 1 -c true +$ zmvolume -e -id 2 -c true + +$ zmvolume -l + Volume id: 1 + name: message1 + type: primaryMessage + path: /opt/zimbra/store + compressed: true threshold: 4096 bytes + current: true + + Volume id: 2 + name: index1 + type: index + path: /opt/zimbra/index + compressed: true threshold: 4096 bytes + current: true +~~~ + + +### Redolog + + +Zimbra gère des _redolog_ c'est-à-dire des journaux de transation où il conserve toutes les actions effectuées. +C'est très intéressant pour la sécurité, mais un peu moins côté consommation disque. Pour les désactiver : + +~~~ +$ zmprov gcf zimbraRedoLogEnabled +zimbraRedoLogEnabled: TRUE +$ zmprov mcf zimbraRedoLogEnabled FALSE +$ zmcontrol shutdown +Host zimbra.example.com + Stopping stats...Done. + Stopping mta...Done. + Stopping spell...Done. + Stopping snmp...Done. + Stopping cbpolicyd...Done. + Stopping archiving...Done. + Stopping antivirus...Done. + Stopping antispam...Done. + Stopping imapproxy...Done. + Stopping memcached...Done. + Stopping mailbox...Done. + Stopping convertd...Done. + Stopping logger...Done. + Stopping zmconfigd...Done. + Stopping ldap...Done. +$ zmcontrol startup +Host zimbra.example.com + Starting ldap...Done. + Starting zmconfigd...Done. + Starting logger...Done. + Starting convertd...Done. + Starting mailbox...Done. + Starting antispam...Done. + Starting antivirus...Done. + Starting snmp...Done. + Starting spell...Done. + Starting mta...Done. + Starting stats...Done. +$ rm -rf /opt/zimbra/redolog/archives/*log /opt/zimbra/redolog/redo.log +~~~ + +### Sauvegardes + +Note : les sauvegardes nécessite l'activation du Redolog (voir ci-dessus). + +Les sauvegardes sont réalisées via des crons qui effectues des sauvegardes complètes, incrémentales et +des nettoyages. On peut gérer ces tâches via la commande _zmschedulebackup_ : + +~~~ +$ zmschedulebackup +Current Schedule: + + f 0 1 * * 6 -a all --mail-report + i 0 1 * * 0-5 --mail-report +~~~ + +Pour modifier le planning des sauvegardes, par exemple pour effacer les sauvegardes au bout de 20 jours : + + +~~~ +$ zmschedulebackup -R d 20d "0 0 * * *" --mail-report +Schedule replaced + +Current Schedule: + + d 20d 0 0 * * * --mail-report +~~~ + +Pour supprimer immédiatement les sauvegardes datant de plus de 15 jours ou 1 jour : + +~~~ +$ zmbackup -del 15d +$ zmbackup -del 1d +~~~ + +Les sauvegarde sont stockées dans /opt/zimbra/backup : + +On retrouvera notamment la liste des comptes dans /opt/zimbra/backup/accounts.xml +Et les sauvegardes complètes dans /opt/zimbra/backup/sessions/full-20XXXXXX.NNN + +ATTENTION : les sauvegardes ne sont utilisables qu'entre des versions identiques de Zimbra ! Cela n'est donc pas utilisable pour des migrations de données de versions différentes. + +### SSH + +Attention, Zimbra utilise l'accès SSH au compte zimbra pour divers paramètres. +Si l'on met des restrictions de type _AllowUsers_ on veillera à garder l'autorisation pour le compte zimbra. + +### Gestion des licences + +Le plus simple est de le gérer en ligne de commande. + +Pour afficher la licence actuelle : + +~~~ +$ zmlicense -p +~~~ + +En théorie, la licence actuelle se trouve dans _/opt/zimbra/conf/ZCSLicense.xml_. + +Pour installer une nouvelle licence (en cas de renouvellement par exemple) : + +~~~ +$ zmlicense -i ZCSLicense.xml +~~~ + +Puis dans l'interface web d'admin, aller dans _Global Settings_ puis _License_ et cliquer sur _Activate license_. + +On peut aussi l'activer via _zmlicense_ (mais cela dysfonctionne souvent avec les anciennes versions de Zimbra). + +~~~ +$ zmlicence -a +~~~ + +Autre possibilité, générer un fichier d'activation activation.xml via puis l'activer via l'interface web ou en ligne de commande : + +~~~ +$ zmlicense -A activation.xml +~~~ + +Autres possibilités : + +~~~ +# Voir le fingerprint de la license +$ zmlicence -f +~~~ + +### Gestion des certificats + +Si vous obtenez des erreurs du type : + +~~~ +Unable to determine enabled services from ldap. +Enabled services read from cache. Service list may be inaccurate. +ERROR: service.FAILURE (system failure: ZimbraLdapContext) (cause: javax.net.ssl.SSLHandshakeException sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: signature check failed) +~~~ + +C'est que le certificat interne de Zimbra a expiré ! + +Pour le renouveler (autosigné), lire et faire : + +~~~ +# zmcertmgr createca -new +# zmcertmgr createcrt -new -days 1000 +# zmcertmgr deploycrt self +# zmcertmgr deployca +# zmcertmgr viewdeployedcrt +~~~ + +Reste un point important à gérer : les _Java KeyStore_ ... et attention car il peut en avoir plusieurs à gérer : +par exemple: cacerts et jssecacerts dans /opt/zimbra/java/jre/lib/security/ ET /opt/zimbra/jdk1.6.0_22/jre/lib/security/ + +On peut éventuellement les gérer bas niveau avec avec keytool : + +~~~ +KEYSTORE_PATH=/opt/zimbra/jdk1.6.0_22/jre/lib/security/jssecacerts (version 7) +KEYSTORE_PATH=/opt/zimbra/jdk-1.7.0_60/jre/lib/security/cacerts (version 8.6) +# /opt/zimbra/java/bin/keytool -list -keystore $KEYSTORE_PATH -storepass changeit +# /opt/zimbra/java/bin/keytool -delete -keystore $KEYSTORE_PATH -storepass changeit +# /opt/zimbra/java/bin/keytool -import -alias my_ca -keystore $KEYSTORE_PATH -storepass changeit -file /tmp/ca.pem +~~~ + +MAIS il est conseillé d'utiliser _zmcertmgr_. Par exemple, pour autoriser les connexions LDAPS vers un certificat SSL de chez StartSSL, on importe les certificats : + +~~~ +# zmcertmgr addcacert /opt/zimbra/ssl/zimbra/ca/ca.pem +** Importing certificate /opt/zimbra/ssl/zimbra/ca/ca.pem to CACERTS as zcs-user-ca.pem...done. +** NOTE: mailboxd must be restarted in order to use the imported certificate. +# zmcertmgr addcacert startssl-ca.pem +** Importing certificate startssl-ca.pem to CACERTS as zcs-user-startssl-ca.pem...done. +** NOTE: mailboxd must be restarted in order to use the imported certificate. +# zmcertmgr addcacert sub.class1.server.ca.pem +** Importing certificate sub.class1.server.ca.pem to CACERTS as zcs-user-sub.class1.server.ca.pem...done. +** NOTE: mailboxd must be restarted in order to use the imported certificate. +~~~ + +Enfin, on doit redémarrer Zimbra. + +Pour installer un certificat externe, vous devez : + +* Générer un fichier CSR (via l'interface web ou "zmcertmgr createcsr") +* Générer le certificat via ce CSR +* Installer le certificat obtenu (par exemple z.example.com.crt) + chaîne de certification : + +~~~ +# /opt/zimbra/bin/zmcertmgr deploycrt comm /tmp/z.example.com.crt /tmp/ca.crt +** Verifying /tmp/z.example.com.crt against /opt/zimbra/ssl/zimbra/commercial/commercial.key +Certificate (/tmp/z.example.com.crt) and private key (/opt/zimbra/ssl/zimbra/commercial/commercial.key) match. +Valid Certificate: /tmp/z.example.com.crt: OK +** Copying /tmp/z.example.com.crt to /opt/zimbra/ssl/zimbra/commercial/commercial.crt +** Appending ca chain /tmp/ca.crt to /opt/zimbra/ssl/zimbra/commercial/commercial.crt +** Importing certificate /opt/zimbra/ssl/zimbra/commercial/commercial_ca.crt to CACERTS as zcs-user-commercial_ca...done. +** NOTE: mailboxd must be restarted in order to use the imported certificate. +** Saving server config key zimbraSSLCertificate...done. +** Saving server config key zimbraSSLPrivateKey...done. +** Installing mta certificate and key...done. +** Installing slapd certificate and key...done. +** Installing proxy certificate and key...done. +** Creating pkcs12 file /opt/zimbra/ssl/zimbra/jetty.pkcs12...done. +** Creating keystore file /opt/zimbra/mailboxd/etc/keystore...done. +** Installing CA to /opt/zimbra/conf/ca...done. +~~~ + +Attention, le fichier ca.crt doit comprendre l'ensemble de la chaîne de certification, souvent certificat racine puis certificat intermédiaire. + + +### Commandes diverses + +~~~ +# Redémarrer Amavis +$ zmamavisdctl restart +# Redémarrer ClamAV +$ zmantivirusctl restart + +# Dump LDAP +$ ./openldap/sbin/slapcat -F /opt/zimbra/data/ldap/config +$ /opt/zimbra/libexec/zmslapcat /tmp +$ /opt/zimbra/libexec/zmslapcat -c /tmp + +# Gestion LDAP +$ ldap status +slapd running pid: 24709 +$ ldap stop +$ ldap start + +# Restaurer l'ensemble des paramètres via LDAP +$ ldap stop +$ rm -f data/ldap/hdb/db/__db.* data/ldap/hdb/db/*.bdb data/ldap/hdb/db/alock data/ldap/hdb/logs/* +$ ./openldap/sbin/slapadd -F /opt/zimbra/data/ldap/config -b "" -q -l /tmp/ldap.bak +_#################### 100.00% eta none elapsed none fast! +Closing DB... +$ vim conf/localconfig.xml +$ ldap start +# /etc/init.d/zimbra restart + +$ zmlocalconfig -s zimbra_ldap_userdn +$ zmlocalconfig -s zimbra_ldap_password + +# Transfert des sauvegardes des données des comptes (uniquement pour des versions identiques) +$ scp -r /opt/zimbra/backup/sessions/full-20120428.NNN newserver.example.com:/opt/zimbra/backup/sessions/ +$ scp -r /opt/zimbra/backup/accounts.xml newserver.example.com:opt/zimbra/backup/ + +# Corriger les permissions +# /opt/zimbra/libexec/zmfixperms +~~~ + +## Stockage des données + + + +Des informations sont stockées dans MySQL (bases mboxgroup*) et dans les répertoires *store/* et *index/*. + +Pour un utilisateur donné, on peut déduire la base utilisée : + +~~~ +$ zmprov getMailboxInfo jdoe@z.example.com +mailboxId: 42 +~~~ + +Les données de cet utilisateur seront dans la mboxgroup* (il suffit de faire mailboxId % 100). + +### Candendrier + +~~~ +MariaDB [(none)]> use mboxgroup42 + +MariaDB [mboxgroup42]> select * from appointment where uid='XXXX'; + +MariaDB [mboxgroup42]> select * from appointment where metadata LIKE ='XXXX'; +MariaDB [mboxgroup42]> select * from mail_item where index_id=NNNN; +~~~ + +NNN étant l'item_id de la table appointment. + +## Mises à jour / migration + +Il faut mettre régulièrement à jour Zimbra, particulièrement lors des mises-à-jour critiques car des failles peuvent exister. + +Attention, vous devez avoir au moins 5 Go d'espace libre. + +## Changement de serveur (en gardant la même version de Zimbra) + +Si vous utilisez strictement la même version d'OS (64 bits, etc.), vous pouvez : + +* Installer votre OS puis un Zimbra vierge +* Couper Zimbra sur l'ancien et le nouveau serveur +* Transférer /opt/zimbra +* Mettre à jour l'IP dans /etc/hosts +* Mettre à jour l'UID/GID dans /opt/zimbra/conf/localconfig.xml +* Redémarrer Zimbra +* Mettre à jour l'IP dans l'admin Zimbra (restrictions MRA) +* Redémarrer Zimbra + +### Mise-à-jour mineure de Zimbra (7.0.0 vers 7.2.6) sous [wiki:Ubuntu] 10.04 LTS 64bits + +~~~ +$ wget +$ tar xvf zcs-NETWORK-7.2.6_GA_2926.UBUNTU10_64.20131203120019.tgz +# cd zcs-NETWORK-7.2.6_GA_2926.UBUNTU10_64.20131203120019 +# ./install.sh + +Operations logged to /tmp/install.log.8252 +Checking for existing installation... + zimbra-ldap...FOUND zimbra-ldap-7.0.0_GA_3077.UBUNTU10_64 + zimbra-logger...FOUND zimbra-logger-7.0.0_GA_3077.UBUNTU10_64 + zimbra-mta...FOUND zimbra-mta-7.0.0_GA_3077.UBUNTU10_64 + zimbra-snmp...FOUND zimbra-snmp-7.0.0_GA_3077.UBUNTU10_64 + zimbra-store...FOUND zimbra-store-7.0.0_GA_3077.UBUNTU10_64 + zimbra-apache...FOUND zimbra-apache-7.0.0_GA_3077.UBUNTU10_64 + zimbra-spell...FOUND zimbra-spell-7.0.0_GA_3077.UBUNTU10_64 + zimbra-convertd...FOUND zimbra-convertd-7.0.0_GA_3077.UBUNTU10_64 + zimbra-memcached...NOT FOUND + zimbra-proxy...NOT FOUND + zimbra-archiving...NOT FOUND + zimbra-cluster...NOT FOUND + zimbra-core...FOUND zimbra-core-7.0.0_GA_3077.UBUNTU10_64 +ZCS upgrade from 7.0.0 to 7.2.6 will be performed. +Checking for available license file... +Current Users=14 Licensed Users=15 + +Saving existing configuration file to /opt/zimbra/.saveconfig + +ZIMBRA NE END USER LICENSE AGREEMENT +[...] +Do you agree with the terms of the software license agreement? [N] y + +Checking for prerequisites... + FOUND: NPTL + FOUND: netcat-openbsd-1.89-3ubuntu2 + FOUND: sudo-1.7.2p1-1ubuntu5.6 + FOUND: libidn11-1.15-2 + FOUND: libpcre3-7.8-3build1 + FOUND: libgmp3c2-2:4.3.2+dfsg-1ubuntu1 + FOUND: libexpat1-2.0.1-7ubuntu1.1 + FOUND: libstdc++6-4.4.3-4ubuntu5.1 + FOUND: libperl5.10-5.10.1-8ubuntu2.3 +Checking for suggested prerequisites... + FOUND: perl-5.10.1 + FOUND: sysstat + FOUND: sqlite3 +Prerequisite check complete. +Checking current number of databases... +Checking for a recent backup + +Do you want to verify message store database integrity? [Y] +Verifying integrity of message store databases. This may take a while. +mysqld is alive +Database errors found. +/opt/zimbra/mysql/bin/mysqlcheck --defaults-file=/opt/zimbra/conf/my.cnf -S /opt/zimbra/db/mysql.sock -A -C -s -u root --auto-repair --password=XXXXXXX +mysql.general_log + Error : You can't use locks with log tables. + mysql.slow_log + Error : You can't use locks with log tables. + +Checking for installable packages + +Found zimbra-core +Found zimbra-ldap +Found zimbra-logger +Found zimbra-mta +Found zimbra-snmp +Found zimbra-store +Found zimbra-apache +Found zimbra-spell +Found zimbra-convertd +Found zimbra-memcached +Found zimbra-proxy +Found zimbra-archiving + + +The Zimbra Collaboration Suite appears already to be installed. +It can be upgraded with no effect on existing accounts, +or the current installation can be completely removed prior +to installation for a clean install. + +Do you wish to upgrade? [Y] + +Select the packages to install + Upgrading zimbra-core + Upgrading zimbra-ldap + Upgrading zimbra-logger + Upgrading zimbra-mta + Upgrading zimbra-snmp + Upgrading zimbra-store + Upgrading zimbra-apache + Upgrading zimbra-spell + Upgrading zimbra-convertd + +Install zimbra-memcached [N] +Install zimbra-proxy [N] +Install zimbra-archiving [N] + +Checking required space for zimbra-core +checking space for zimbra-store + +Installing: + zimbra-core + zimbra-ldap + zimbra-logger + zimbra-mta + zimbra-snmp + zimbra-store + zimbra-apache + zimbra-spell + zimbra-convertd + +The system will be modified. Continue? [N] y + +Shutting down zimbra mail + +Backing up the ldap database...done. + +Removing existing packages + + zimbra-ldap...done + zimbra-logger...done + zimbra-mta...done + zimbra-snmp...done + zimbra-store...done + zimbra-spell...done + zimbra-convertd...done + zimbra-apache...done + +Removing deployed webapp directories +Installing packages + + zimbra-core......zimbra-core_7.2.6_GA_2926.UBUNTU10_64_amd64.deb...done + zimbra-ldap......zimbra-ldap_7.2.6_GA_2926.UBUNTU10_64_amd64.deb...done + zimbra-logger......zimbra-logger_7.2.6_GA_2926.UBUNTU10_64_amd64.deb...done + zimbra-mta......zimbra-mta_7.2.6_GA_2926.UBUNTU10_64_amd64.deb...done + zimbra-snmp......zimbra-snmp_7.2.6_GA_2926.UBUNTU10_64_amd64.deb...done + zimbra-store......zimbra-store_7.2.6_GA_2926.UBUNTU10_64_amd64.deb...done + zimbra-apache......zimbra-apache_7.2.6_GA_2926.UBUNTU10_64_amd64.deb...done + zimbra-spell......zimbra-spell_7.2.6_GA_2926.UBUNTU10_64_amd64.deb...done + zimbra-convertd......zimbra-convertd_7.2.6_GA_2926.UBUNTU10_64_amd64.deb...done + +Setting defaults from saved config in /opt/zimbra/.saveconfig/config.save + HOSTNAME=z.example.com + LDAPHOST=z.example.com + LDAPPORT=389 + SNMPTRAPHOST=z.example.com + SMTPSOURCE=admin@z.example.com + SMTPDEST=admin@z.example.com + SNMPNOTIFY=yes + SMTPNOTIFY=yes + LDAPROOTPW=XXX + LDAPZIMBRAPW=XXX + LDAPPOSTPW=XXX + LDAPREPPW=XXX + LDAPAMAVISPW=XXX + LDAPNGINXPW=XXX +Restoring existing configuration file from /opt/zimbra/.saveconfig/localconfig.xml...done +Operations logged to /tmp/zmsetup.01092014-000043.log +Upgrading from 7.0.0_GA_3077 to 7.2.6_GA_2926 +Stopping zimbra services...done. +Verifying /opt/zimbra/conf/my.cnf +Starting mysql...done. +This appears to be 7.0.0_GA +Checking ldap status...not running. +Running zmldapapplyldif...done. +Checking ldap status...already running. +Redolog version update required. +Thu Jan 9 00:01:23 2014: Verified redolog version 1.30. +Thu Jan 9 00:01:23 2014: Updating Redolog schema version from 1.30 to 1.31. +Redolog version update finished. +Stopping mysql...done. +Updating from 7.0.1_GA +Updating from 7.1.0_GA +Updating from 7.1.1_GA +Updating from 7.1.2_GA +Updating from 7.1.3_GA +Updating from 7.1.4_GA +Updating from 7.2.0_GA +Updating from 7.2.1_GA +Updating from 7.2.2_GA +Updating from 7.2.3_GA +Updating from 7.2.4_GA +Updating from 7.2.5_GA +Updating from 7.2.6_GA +Updating global config and COS's with attributes introduced after 7.0.0_GA...done. +Stopping ldap...done. +Upgrade complete. + +Running bdb db_recover...done. +Running zmldapapplyldif...done. +Checking ldap status....already running. +Setting defaults...done. +Setting defaults from existing config...done. +Checking for port conflicts +Setting defaults from ldap...done. +Saving config in /opt/zimbra/config.11327...done. +Operations logged to /tmp/zmsetup.01092014-000043.log +Setting local config values...done. +Setting up CA...done. +Deploying CA to /opt/zimbra/conf/ca ...done. +Warning: No valid SSL certificates were found. +New self-signed certificates will be generated and installed. +Creating SSL certificate...done. +Creating SSL certificate...done. +Creating SSL certificate...done. +Installing mailboxd SSL certificates...done. +Setting replication password...done. +Setting Postfix password...done. +Setting amavis password...done. +Setting nginx password...done. +Creating server entry for z.example.com...already exists. +Saving CA in ldap ...done. +Saving SSL Certificate in ldap ...done. +Setting spell check URL...done. +Setting service ports on z.example.com...done. +Adding z.example.com to zimbraMailHostPool in default COS...done. +Installing webclient skins... + lake...done. + lemongrass...done. + carbon...done. + tree...done. + steel...done. + waves...done. + bare...done. + pebble...done. + hotrod...done. + oasis...done. + twilight...done. + lavender...done. + bones...done. + sky...done. + beach...done. + smoke...done. + sand...done. +Finished installing webclient skins. +Setting Keyboard Shortcut Preferences...done. +Setting zimbraFeatureTasksEnabled=TRUE...done. +Setting zimbraFeatureBriefcasesEnabled=TRUE...done. +Setting MTA auth host...done. +Setting TimeZone Preference...done. +prov> Initializing mta config...done. +Setting services on z.example.com...done. +Creating user spam.r4nd0m@z.example.com...already exists. +Creating user ham.r4nd0m@z.example.com...already exists. +Creating user virus-quarantine.r4nd0m@z.example.com...already exists. +Setting spam training and Anti-virus quarantine accounts...done. +Configuring SNMP...done. +Checking for default IM conference room...already initialized. +Setting up syslog.conf...Failed +Looking for valid license to install...license already installed. +Activating license...license activated. +Starting servers...done. +Checking for deprecated zimlets...done. +Installing common zimlets... + com_zimbra_viewmail...done. + com_zimbra_srchhighlighter...done. + com_zimbra_cert_manager...done. + com_zimbra_attachmail...done. + com_zimbra_social...done. + com_zimbra_attachcontacts...done. + com_zimbra_phone...done. + com_zimbra_bulkprovision...done. + com_zimbra_webex...done. + com_zimbra_linkedin...done. + com_zimbra_url...done. + com_zimbra_email...done. + com_zimbra_date...done. + com_zimbra_dnd...done. + com_zimbra_adminversioncheck...done. +Finished installing common zimlets. +Installing network zimlets... + com_zimbra_backuprestore...done. + com_zimbra_license...done. + com_zimbra_smime_cert_admin...done. + com_zimbra_mobilesync...done. + com_zimbra_hsm...done. + com_zimbra_delegatedadmin...done. + com_zimbra_smime...done. + com_zimbra_convertd...done. +Finished installing network zimlets. +Getting list of all zimlets...done. +Updating non-standard zimlets... + com_zimbra_webex...done. +Finished updating non-standard zimlets. +Restarting mailboxd...done. +Setting up zimbra crontab...done. + +Moving /tmp/zmsetup.01092014-000043.log to /opt/zimbra/log + +Configuration complete - press return to exit +~~~ + +### Mise-à-jour majeure de Zimbra (7.2 vers 8.6) + +Attention : pour une mise à jour majeure, assurez-vous d'avoir une licence non perpétuelle (car les mises à jour majeures ne sont pas supportées !) + +Les méthodes recommandées par le support Zimbra sont : + et + +En résumé, la mise à jour se fait en réinstallant Zimbra (install.sh). + +Par exemple, pour passer de Ubuntu 10.04/ZCS 7.2 en Ubuntu 14.04/ZCS 8.6 il faut : + +* Sous Ubuntu 10.04, passer de ZCS 7.2 à ZCS 8.0.9 +* Passer de Ubuntu 10.04 en Ubuntu 12.04 +* Sous Ubuntu 12.04, passer de ZCS 8.0.9 en 8.6 +* Passer de Ubuntu 12.04 en Ubuntu 14.04 +* Réinstaller ZCS 8.6 avec les packages pour Ubuntu 14.04 + +~~~ +# cd zcs-NETWORK-8.0.9_GA_6191.UBUNTU10_64.20141103151643 +# ./install.sh -a /root/activation.xml + +[...] +The Zimbra Collaboration Server appears already to be installed. +It can be upgraded with no effect on existing accounts, +or the current installation can be completely removed prior +to installation for a clean install. + +Do you wish to upgrade? [Y] +[...] + +Upgrading from 7.2.6_GA_2926 to 8.0.9_GA_6191 +Stopping zimbra services...done. +This appears to be 7.2.6_GA +Starting mysql...done. +Upgrading ldap data...done. +Upgrading LDAP configuration database...done. +Loading database...done. +Checking ldap status...not running. +Running zmldapapplyldif...done. +Checking ldap status...not running. +Starting ldap...done. +Checking ldap status...already running. +Running mysql_upgrade...done. +Redolog version update required. +Thu May 19 12:20:18 2016: Verified redolog version 1.31. +Thu May 19 12:20:18 2016: Updating Redolog schema version from 1.31 to 1.42. +Redolog version update finished. +Schema upgrade required from version 65 to 92. +Running /opt/zimbra/libexec/scripts/migrate20120611_7to8_bundle.pl +Thu May 19 12:20:22 2016: Verified schema version 65. +Thu May 19 12:20:23 2016: Adding device information columns to ZIMBRA.MOBILE_DEVICES table... +Thu May 19 12:20:24 2016: Adding ZIMBRA.PENDING_ACL_PUSH table... +Thu May 19 12:20:24 2016: Adding TAG table... +............ +Thu May 19 12:20:35 2016: Adding TAGGED_ITEM table... +............ +Thu May 19 12:20:46 2016: Adding version and last_purge_at columns to ZIMBRA.MAILBOX table... +Thu May 19 12:20:47 2016: Adding/Modifying columns in mail_item, mail_item_dumpster, revision, revision_dumpster tables... +............ +............ +............ +............ +Thu May 19 12:22:09 2016: Dropping IM tables... +Thu May 19 12:22:11 2016: Verified schema version 65. +Thu May 19 12:22:11 2016: Updating DB schema version from 65 to 90. +Running /opt/zimbra/libexec/scripts/migrate20120410-BlobLocator.pl +Thu May 19 12:22:14 2016: Verified schema version 90. +Thu May 19 12:24:22 2016: Verified schema version 90. +Thu May 19 12:24:22 2016: Updating DB schema version from 90 to 91. +Running /opt/zimbra/libexec/scripts/migrate20121009-VolumeBlobs.pl +Thu May 19 12:24:26 2016: Verified schema version 91. +Thu May 19 12:24:28 2016: Verified schema version 91. +Thu May 19 12:24:28 2016: Updating DB schema version from 91 to 92. +Stopping mysql...done. +Updating from 7.2.7_GA +Updating from 7.2.8_GA +Updating from 8.0.0_BETA1 +Adding dynamic group configuration +Stopping ldap...done. +Checking ldap status...not running. +Running zmldapapplyldif...done. +Checking ldap status...not running. +Starting ldap...done. +Stopping ldap...done. +Checking ldap status...not running. +Running zmldapapplyldif...done. +Checking ldap status...not running. +Starting ldap...done. +Updating from 8.0.0_BETA2 +Starting mysql...done. +Stopping mysql...done. +Updating from 8.0.0_BETA3 +Updating from 8.0.0_BETA4 +Stopping ldap...done. +Checking ldap status...not running. +Running zmldapapplyldif...done. +Checking ldap status...not running. +Starting ldap...done. +Stopping ldap...done. +Checking ldap status...not running. +Running zmldapapplyldif...done. +Checking ldap status...not running. +Starting ldap...done. +Stopping ldap...done. +Checking ldap status...not running. +Running zmldapapplyldif...done. +Checking ldap status...not running. +Starting ldap...done. +Stopping ldap...done. +Checking ldap status...not running. +Running zmldapapplyldif...done. +Checking ldap status...not running. +Starting ldap...done. +Updating from 8.0.0_BETA5 +Updating from 8.0.0_GA +Updating from 8.0.1_GA +Updating from 8.0.2_GA +Updating from 8.0.3_GA +Updating from 8.0.4_GA +Updating from 8.0.5_GA +Updating from 8.0.6_GA +Updating from 8.0.7_GA +Updating from 8.0.8_GA +Updating from 8.0.9_GA +Updating global config and COS's with attributes introduced after 7.2.6_GA...done. +Stopping ldap...done. +Upgrade complete. + +[...] + +# do-release-upgrade + +# apt-get install libperl5.14 unzip +# cd zcs-NETWORK-8.6.0_GA_1153.UBUNTU12_64.20141215195643 +# ./install.sh -s --skip-activation-check + +[...] + Do you want to verify message store database integrity? [Y] No +[...] + +Software Installation complete! + +# ./install.sh + +[...] +ZCS upgrade from 8.6.0 to 8.6.0 will be performed. +[...] + +[...] + Do you want to verify message store database integrity? [Y] Yes +[...] + +Updating from 8.5.0_BETA1 +Updating from 8.5.0_BETA2 +Updating from 8.5.0_BETA3 +Updating from 8.5.0_GA +Updating from 8.5.1_GA +Updating from 8.6.0_BETA1 +Updating from 8.6.0_BETA2 +Updating from 8.6.0_GA +Updating global config and COS's with attributes introduced after 8.0.9_GA...done. +[...] + + +# do-release-upgrade + +# apt install libperl5.18 +# cd zcs-NETWORK-8.6.0_GA_1153.UBUNTU14_64.20141215151218 +# ./install.sh -s --skip-activation-check + +[...] + Do you want to verify message store database integrity? [Y] No +[...] + +# ./install.sh + +[...] + Do you want to verify message store database integrity? [Y] Yes +[...] + +# /opt/zimbra/libexec/zmfixperms +# reboot + +~~~ + + +### Migration de données + +En dehors des sauvegardes (pour des versions de Zimbra identiques) et des mises à jour majeures, il existe des outils plus ou fonctionnels pour migrer des données : + +* l'outil zmztozmig : attention, pas mal de choses ne sont pas conservées, comme les préférences utilisateur, les items partagés et parfois une partie des données :( + voir + +~~~ +[INFO|main:1| 05/18/2016 03:29:05]: ****************SUMMARY************************** +[INFO|main:1| 05/18/2016 03:29:05]: Total Accounts processed : 12 +[INFO|main:1| 05/18/2016 03:29:05]: Successfull Accounts : 12 +[INFO|main:1| 05/18/2016 03:29:05]: Failed accounts : 0 +[INFO|main:1| 05/18/2016 03:29:05]: Total Migration Time(seconds) : 2791.538 +[INFO|main:1| 05/18/2016 03:29:05]: ************************************************* +~~~ + +* l'outil _zmmailbox getRestURL/postRestURL_ : zmmailbox -z -m ACCOUNT getRestURL "/?fmt=tgz" > /tmp/ACCOUNT.tgz voir +* requête sur l'interface REST directement : voir + +Exemples : + +~~~ +$ wget --no-check-certificate +$ wget --no-check-certificate +$ wget --no-check-certificate +~~~ + +et l'on peut réinjecter les données de façon similaire. + + +## FAQ + +### Il manque des menus dans l'interface d'admin + +C'est probablement que les zimlets par défaut ne sont pas installés. +Vérifier avec la commande `zmzimletctl listZimlets`. +Si aucun zimlets n'est présent on les installera à la main (en théorie ça devrait être installé automatiquement…) : + +~~~ +$ cd /opt/zimbra/zimlets +$ for i in *.zip; do zmzimletctl deploy $i; done$ +$ cd ../zimlets-network/ +$ for i in *.zip; do zmzimletctl deploy $i; done +~~~ + +### Failles de sécurité + +Il est important de mettre à jour régulièrement Zimbra. Il y a notamment _des remote exploits_ qui permettent +à n'importe qui de prendre la main sur votre Zimbra si vous n'êtes pas à jour ! + +Voir + +Citons notamment la faille de décembre 2013 décrite sur +qui permet d'avoir accès au localconfig.xml contenant plusieurs mots de passe critiques via : + + + +### Erreurs Java SSL + +Java est strict avec le SSL... difficile d'ignorer les erreurs. + +En cas de certificat expiré, chaîne de certification invalide (_unable to find valid certification path to requested target_), Java va vous jeter. + +Vous devez donc avoir un certificat valide, et une chaîne de certification correcte (en ajoutant manuellement les certificats CA si besoin, voir [wiki:HowtoZimbra#Gestiondescertificats] + +### GAL LDAP externe cassée + +Si vous n'avez plus de GAL via LDAP sur votre smartphone et que vous obtenez "ldap search failure" lors d'une recherche dans la GAL via l'interface web, la solution (à confirmer) est d'importer votre certificat dans le keytool : + +~~~ +# openssl s_client -connect ldap.example.com:636 > EXTERNAL-LDAP-CERT-FILE +# /opt/zimbra/java/bin/keytool -import -alias EXTERNAL-LDAP -keystore /opt/zimbra/java/jre/lib/security/cacerts -storepass changeit -file /tmp/EXTERNAL-LDAP-CERT-FILE +Certificate was added to keystore +# /etc/init.d/zimbra stop +# /etc/init.d/zimbra start +~~~ + +### Purge d'une boîte mail + +Par exemple de la boîte d'admin : + +~~~ +$ zmmailbox -z -m admin@z.example.com emptyFolder /Inbox +~~~ + +### Erreur ssl_error_weak_server_ephemeral_dh_key sous Firefox/Thunderbird + +Il faut désactiver certains ciphers : + +~~~ +$ zmprov mcf +zimbraSSLExcludeCipherSuites TLS_DHE_RSA_WITH_AES_128_CBC_SHA +$ zmprov mcf +zimbraSSLExcludeCipherSuites TLS_DHE_RSA_WITH_AES_256_CBC_SHA +$ zmprov mcf +zimbraSSLExcludeCipherSuites SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA +$ zmmailboxdctl restart +Stopping mailboxd...done. +Starting mailboxd...done. +~~~ + +Voir diff --git a/HowtoZimbra/Android.md b/HowtoZimbra/Android.md new file mode 100644 index 00000000..92604629 --- /dev/null +++ b/HowtoZimbra/Android.md @@ -0,0 +1,8 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +Bugs Android avec ActiveSync : + +* pas de multi-agendas +* mauvaise gestion du statut privé lors d'une modification +* pas de suppression du mail de notification après une réponse à une invitation +* le push est moins réactif que l'iPhone (?!) diff --git a/HowtoZimbra/PocketPC.md b/HowtoZimbra/PocketPC.md new file mode 100644 index 00000000..2266cb81 --- /dev/null +++ b/HowtoZimbra/PocketPC.md @@ -0,0 +1,14 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto PocketPC + +Exemple de configuration avec un HTC Touch2 T3333 : + +~~~ +1. Dans "Config messag.", mettre l'adresse de messagerie (avec @example.com) et le mot de passe. +2. Passe en "Configuration manuelle" +3. Ne pas préciser de "Domaine:" +4. Mettre l'adresse du serveur +5. ATTENTION, bizarrement, il ne faut pas cocher la case "Ce serveur nécessite une connexion cryptée (SSL)" +6. Choisir ce que l'on veut synchroniser, et c'est terminé. +~~~ diff --git a/HowtoZram.md b/HowtoZram.md new file mode 100644 index 00000000..410b94f3 --- /dev/null +++ b/HowtoZram.md @@ -0,0 +1,28 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto zram + + + +*zram* est disponible à partir de Debian Wheezy ou Squeeze avec noyau backports (3.2). + +Activation sous Debian : + +~~~ +# modprobe zram +# echo $((128*1024*1024)) > /sys/block/zram0/disksize +# mkswap /dev/zram0 +Setting up swapspace version 1, size = 131068 KiB +no label, UUID=bbd67c91-21c2-4273-9ba0-07f654ad9854 +# swapon -p 10 /dev/zram0 +# swapon -s +Filename Type Size Used Priority +/dev/zram0 partition 131068 0 10 +~~~ + +Pour l'activer au démarrage, on pourra mettre dans /etc/rc.local : + +~~~ +modprobe zram && echo $((128*1024*1024)) > /sys/block/zram0/disksize && mkswap /dev/zram0 && swapon -p 10 /dev/zram0 || true +exit 0 +~~~ diff --git a/Howtoansible/Guidelines.md b/Howtoansible/Guidelines.md new file mode 100644 index 00000000..7ef2606b --- /dev/null +++ b/Howtoansible/Guidelines.md @@ -0,0 +1,12 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Recommandations et politique Evolix pour l'écriture des _playbooks_ + +* séparer les _tasks_, _handlers_, _templates_, _files_ et _vars_ dans des répertoires et fichiers différents. Voir [ici](http://docs.ansible.com/ansible/playbooks_best_practices.html#directory-layout) pour la hierarchie à respecter ; +* utiliser `gather_facts: no` si le playbook ne les utilisent pas (gain de temps lors de l'exécution) ; +* toujours nommer les tâches ; +* s'assurer que chaque tâche est idopotente, notamment pour l'exécution de commande et les remplacement suivant des expressions rationnelles ; + +Lire également les recommandations sur la [documentation officielle](http://docs.ansible.com/ansible/playbooks_best_practices.html). + +Vidéo "Getting Started" (35 minutes en Anglais) : \ No newline at end of file diff --git a/Howtonfdump.md b/Howtonfdump.md new file mode 100644 index 00000000..f9331c54 --- /dev/null +++ b/Howtonfdump.md @@ -0,0 +1,44 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto !nfdump + +Documentation officielle : + +## installation + +~~~ +apt install nfdump +~~~ + +## Collecter les flows + +Il faut au préalable avoir configuré l'export des flows sur vos routeurs et avoir un collecteur de flow en place. + +Un collecteur (nfcapd) est fourni avec nfdump. On peut le faire écouter de la façon suivante : +~~~ +nfcapd -w -D -p 9996 -B 200000 -S 1 -z -I routeur -l /opt/nflow/routeur +~~~ + + +## Analyser les flows + +Lister toutes les connexions vers le port 80 : +~~~ +nfdump -M /opt/nflow/routeur -T -R 2016/09/07/nfcapd.201609070315:2016/09/07/nfcapd.201609070320 -o extended 'proto tcp and ( src port > 1024 and dst port 80 )' +~~~ + + +Lister toutes les connexions vers le port 80 de l'IP 1.2.3.4 : +~~~ +nfdump -M /opt/nflow/routeur -T -R 2016/09/07/nfcapd.201609070315:2016/09/07/nfcapd.201609070320 -o extended 'proto tcp and host 1.2.3.4 and ( src port > 1024 and dst port 80 )' +~~~ + +Lister toutes les connexions vers le port 80 de l'IP 1.2.3.4 et aggréger sur l'IP source : +~~~ +nfdump -M /opt/nflow/routeur -T -R 2016/09/07/nfcapd.201609070315:2016/09/07/nfcapd.201609070320 'proto tcp and host 1.2.3.4 and ( src port > 1024 and dst port 80 )' -A srcip +~~~ + +Lister toutes les connexions vers le port 80 de l'IP 1.2.3.4 et faire une somme : +~~~ +nfdump -M /opt/nflow/routeur -T -R 2016/09/07/nfcapd.201609070315:2016/09/07/nfcapd.201609070320 'proto tcp and host 1.2.3.4 and ( src port > 1024 and dst port 80 )' -s srcip +~~~ \ No newline at end of file diff --git a/HowtophpMyAdmin.md b/HowtophpMyAdmin.md new file mode 100644 index 00000000..353f70de --- /dev/null +++ b/HowtophpMyAdmin.md @@ -0,0 +1,73 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto phpMyAdmin + +~~~ +# apt install phpmyadmin +~~~ + +Si l'on utilise phpMyAdmin avec Apache cela va ajouter le fichier /etc/apache2/conf-enabled/phpmyadmin.conf (sous Debian 7: /etc/apache2/conf.d/phpmyadmin.conf) qui configure un _Alias /phpmyadmin_ accessible de n'importe quel site sur le serveur... on préfèrera restreindre phpMyAdmin à un VirtualHost précis, avec un _Alias_ non standard (exemple _/pma-42_) et si possible restreint par IP : + +~~~ +# a2disconf phpmyadmin +Conf phpmyadmin disabled. +To activate the new configuration, you need to run: + service apache2 reload +# sed -i s/^Alias/#Alias/ /etc/apache2/conf-available/phpmyadmin.conf +~~~ + +en ajoutant dans le VirtualHost approprié : + +~~~ + Alias /pma-42 /usr/share/phpmyadmin/ + Include /etc/apache2/conf-available/phpmyadmin.conf + + Deny from all + Allow from 192.0.2.42 + Allow from 2001:db8::42 + +~~~ + +Note : dans tous les cas, on veillera à bien conserver la plupart des instructions du fichier /etc/apache2/conf-available/phpmyadmin.conf qui sont importantes pour la sécurité. + +## Configuration + +Il est préférable de modifier la configuration via l'interface web en ajoutant /setup/ à l'URL de phpMyAdmin + +Cela va demander un identifiant que l'on pourra configurer via /etc/phpmyadmin/htpasswd.setup + +Attention, pour sauvegarder sa configuration, il est nécessaire de lancer la commande pma-configure avant : + +~~~ +# pma-configure +Unsecuring phpMyAdmin installation... +Setup script can now write to the configuration file. + +Do not forget to run /usr/sbin/pma-secure after configuring, +~~~ + +Une fois les changements sauvegardés dans l'interface /setup/ (par exemple on pourra ajouter plusieurs serveurs MySQL) on lancera la commande pma-secure : + +~~~ +# pma-secure +Securing phpMyAdmin installation... +Setup script won't be able to write configuration. +~~~ + +## Utilisation derrière un reverse-proxy + +Si l'on utilise phpMyAdmin derrière un reverse-proxy, il faudra probablement forcer la variable de configuration PmaAbsoluteUri +Par exemple si le serveur HTTP "caché" tourne sur le port TCP/8080, mais que celui-ci n'est pas accessible directement, on devra forcer +PmaAbsoluteUri pour utiliser une URL sans 8080. Cela se passe dans le fichier de configuration /etc/phpmyadmin/config.inc.php : + + +~~~ +$cfg['PmaAbsoluteUri'] = ' +~~~ + + +## Support + +Lors upload d'un fichier (pour import par ex) : +` Le fichier ne peut être lu.` +Vérifier si _upload_tmp_dir_ est bien dans la liste et contenu dans _open_basedir_, et que le répertoire ait les bon droits. diff --git a/Infortrend-DS-S12E-G2140-4.md b/Infortrend-DS-S12E-G2140-4.md new file mode 100644 index 00000000..3db4a575 --- /dev/null +++ b/Infortrend-DS-S12E-G2140-4.md @@ -0,0 +1,81 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Infortrend DS S12E-G2140-4 + +Méthode d'administration possible : port console, telnet, ssh, + +## Informations utiles + +Le mot de passe par défaut est vide, quand on vous demande un mot de passe, appuyer juste sur « entrer ».[[BR]] + +[Manuel](http://viproom.infortrend.com.tw/Datatree/EonStor%20DS/ESDS%20B12E-R_G2140/Operation%20Manual/ESDS_B12E_HMN_v1.0.zip) + +# Configuration basique étape par étape + +Le but de ce petit « tutoriel » consiste à créer un device iSCSI qui sera accessible pour un serveur. + +## Connexion avec câble série + +Paramétrage minicom : + +~~~ +# Fichier généré automatiquement - utilisez « minicom -s » +# pour changer les paramètres +pu port /dev/ttyUSB0 +pu baudrate 38400 +pu bits 8 +pu parity N +pu stopbits 1 +pu rtscts No +~~~ + +Ce qu'il faut retenir, par défaut le port COM est configuré à une vitesse de 38400 bauds/sec. À une vitesse inférieur ça ne fonctionne pas ! + +## Connexion en telnet + +Par défaut toutes les interfaces sont en DHCP, connectez l'interface d'administration à votre réseau, et regarder quelle IP votre serveur DHCP lui a affecté. +Il suffit ensuite de se connecter en telnet et sélectionner le mode VT100 : + +~~~ +telnet adresse_ip +~~~ + +## Création d'un disque logique + +Allez dans la section « view and edit Logical drives » et créer le RAID voulu (type de RAID, disque en SPARE, etc ...) + +## Création d'un volume logique + +Allez dans la section « view and edit logical Volume » et créer le volume logique composé du RAID précédemment crée. Enfin partionnez-le comme voulu (une partition minimum). + +## Affecter un volume logique à un LUN + +Allez dans la section « view and edit Host luns » et affecter sur un channel choisi, un volume logique. Le volume sera ainsi accessible sur ce channel. + +## Connaître l'adresse IP d'un channel / Configuration statique + +Comme les interfaces sont configurées en DHCP, on peut savoir quelle adresse IP est affectée en allant dans : + +1. view and edit Configuration parameters +1. Communication Parameters +1. Internet Protocol (TCP/IP) +1. Noter l'adresse IP du channel. + +On peut aussi éditer l'interface de façon à passer en statique au lieu de DHCP. + +## Monter le device iSCSI sous GNU/Linux + +Cf. [wiki:HowtoISCSI] + +# Interface Web + +Le SAN dispose d'une interface Web pour l'administrer. Cette interface est très lente à utiliser, préférez telnet ! La seule chose intéressante est qu'elle indique l'état de santé du SAN (état des ventilateurs, température CPU, ...), mais on peut aussi le voir avec telnet ;-) + +[[Image(webinterface.png, 33%)]] + +# Divers paramètres + +## Changer le mot de passe + +1. system Functions +1. change Password \ No newline at end of file diff --git a/InfosMegaCLI.md b/InfosMegaCLI.md new file mode 100644 index 00000000..63b50ddf --- /dev/null +++ b/InfosMegaCLI.md @@ -0,0 +1,132 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Infos MegaCLI + + + + +## Commandes de base + +~~~ +# megacli -adpallinfo -aALL +# megacli -pdlist -aALL +# megacli -AdpEventLog -GetEvents -aALL +~~~ + +Note : -aALL indique d'appliquer la commande sur tout les contrôleur disponibles, souvent on en a qu'un seul, donc c'est pratique, plutôt que de chercher son ID (Même si c'est souvent a0). + +Récupérer l'Enclosure Id (E) et le numéro de Slot (S) des disques : + +~~~ +# megacli -PDList -aALL |grep -E 'Enclosure Device|Slot|Inquiry' +~~~ + +On notera alors *\[E:S\]* l'emplacement du disque souhaité. + +Note : Si E (Enclosure Id) est N/A, on mettra alors \[:S\] + +Infos sur un disque : + +~~~ +# megacli -pdinfo -PhysDrv \[E:S\] -a0 +~~~ + + +## Passer un disque en HotSpare + +Typiquement après le changement d'un disque défectueux, si le rebuild ne se fait pas automatiquement, l'astuce est de passer le nouveau disque en Hot Spare. Ainsi le contrôleur « prendra » le disque Hot Spare pour faire le rebuild. + +~~~ +megacli -PDHSP -Set -PhysDrv \[65535:2\] -a0 +~~~ + +Cela passe le disque d'ID 2, enclosure 65535, en Hot Spare. + +## Utiliser un disque HotSpare + +Parfois, un disque est disponible en tant que HotSpare, mais le controleur ne l'utilise pas… Une astuce est de dire qu'il n'est plus HS, puis le repasser HS. + + +~~~ +megacli -PDHSP -Rmv -PhysDrv [8:4] -a0 +megacli -PDHSP -Set -Dedicated -Array0 -PhysDrv [8:4] -a0 +~~~ + +Cela remet le disque d'ID 4; enclosure 8, en tant que HS dédié pour l'array 0. + +## Contrôler le rebuild d'un disque + +~~~ +# megacli -pdrbld -showprog -physdrv\[E:S\] -a0 + +Rebuild Progress on Device at Enclosure E, Slot S Completed 10% in 23 Minutes. +~~~ + +## Passer un disque en offline + +~~~ +megacli -PDOffline -PhysDrv \[E:S\] -a0 +~~~ + +## Passer un disque en missing + +Ça le sort du RAID. +~~~ +megacli -PDMarkMissing -PhysDrv \[E:S\] -a0 +~~~ + +## Passer un disque en JBOD à unconfigured(good) + +~~~ +megacli -PDMakeGood -PhysDrv\[E:S\] -force -a0 +~~~ + +## Remplacer un disque missing + +Lister d'abord : + +~~~ +# megacli -PdGetMissing -a0 + + Adapter 0 - Missing Physical drives + + No. Array Row Size Expected + 0 0 0 139236 MB + +Exit Code: 0x00 +~~~ + +Le disque (row 0) de l'array 0 est missing. Pour cet exemple, on va dire au disque physique 64:2 de prendre la place du row 0. + +~~~ +megacli -PdReplaceMissing -PhysDrv \[64:2\] -Array0 -row0 -a0 +~~~ + +Le passer online + +~~~ +megacli -PDOnline -PhysDrv \[64:2\] -a0 +~~~ + +## Faire clignoter un disque + +~~~ +# megacli -PdLocate -start -physdrv\[E:S\] -a0 +~~~ + +Note : cela ne fonctionne pas sur tous les contrôleurs + +## Configurer un volume RAID à partir de nouveaux disques + +Vérifier que les disques ne sont pas déjà dans un volume RAID : + +~~~ +# megacli -ldpdinfo -a0 |grep -E '(Virtual|Inquiry|Slot)' +~~~ + +Créer le volume : +~~~ +# megacli -CfgLdAdd -r1[E:S1,E:S2] -a0 +~~~ + +-r1 indique le type de RAID, E correspond au numéro d'enclosure et S1 et S2 sont les numéros de slot des disques. diff --git a/LSI-SAS1068E.md b/LSI-SAS1068E.md new file mode 100644 index 00000000..1b93d274 --- /dev/null +++ b/LSI-SAS1068E.md @@ -0,0 +1,35 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# RAID LSI-SAS1068E + +Cartes compatibles : +~~~ +04:01.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 08) +~~~ + +## Monitoring avec mpt-status + +Le paquet mpt-status contient le binaire mpt-status qui permet de consulter l'état d'un contrôleur raid du type LSI-SAS1068E, mais aussi un daemon qui permet de vérifier le status toutes les x minutes et de prévenir par mail. + +~~~ +# aptitude install mpt-status +~~~ + +Charger le module noyau : + +~~~ +modprobe mptctl +~~~ +Ajouter aussi cette ligne dans le fichier `/etc/rc.local`, de façon à le charger à chaque démarrage de la machine. +(Note de Romain : pas sûr que ce soit nécessaire.) + +Et enfin créez le fichier `/etc/default/mpt-statusd` pour configurer le mail de destination, et le timing des check. + +~~~ +MAILTO=alice@bob.com # Where to report problems +PERIOD=3600 # Seconds between each check (default 10 minutes) +REMIND=3600 # Seconds between each reminder (default 2 hours) +RUN_DAEMON=yes +ID=0 +~~~ + diff --git a/LSI.md b/LSI.md new file mode 100644 index 00000000..98917631 --- /dev/null +++ b/LSI.md @@ -0,0 +1,68 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +Télécharger le binaire 32bits suivant (on prendra soin d'installer les ia32-libs avant) : [] + +Lancer le binaire et suivez ce qui suit : +~~~ +machine:~> ./lsiutil + +LSI Logic MPT Configuration Utility, Version 1.38, July 6, 2005 + +1 MPT Port found + +Port Name Chip Vendor/Type/Rev MPT Rev Firmware Rev +1. /proc/mpt/ioc0 XXXXXX XXX XXX + +Select a device: [1-1 or 0 to quit] 1 + +1. Identify firmware, BIOS, and/or FCode +1. Download firmware (update the FLASH) +1. Download/erase BIOS and/or FCode (update the FLASH) +1. Scan for devices +10. Change IOC settings (interrupt coalescing) +13. Change SAS IO Unit settings +16. Display attached devices +20. Diagnostics +21. RAID actions +22. Reset bus +23. Reset target +30. Beacon on +31. Beacon off +97. Reset SAS phy +98. Reset SAS link +99. Reset port + +Main menu, select an option: [1-99 or e for expert or 0 to quit] 21 + +1. Show volumes +1. Show physical disks +1. Get volume state +23. Replace physical disk +30. Create volume +31. Delete volume +32. Change volume settings + +RAID actions menu, select an option: [1-99 or e for expert or 0 to quit] 32 + +Volume: [0-1 or RETURN to quit] 0 + +Volume 0 Settings: write caching disabled, auto configure, priority resync +Volume 0 draws from Hot Spare Pools: + +Enable write caching: [Yes or No, default is No] Yes +Offline on SMART data: [Yes or No, default is No] +Auto configuration: [Yes or No, default is Yes] +Priority resync: [Yes or No, default is Yes] +Hot Spare Pools (bitmask of pool numbers): [00 to FF, default is 01] + +RAID actions menu, select an option: [1-99 or e for expert or 0 to quit] 0 + +Main menu, select an option: [1-99 or e for expert or 0 to quit] 0 + +Port Name Chip Vendor/Type/Rev MPT Rev Firmware Rev +1. /proc/mpt/ioc0 LSI Logic SAS1068 B0 105 000a310 + +Select a device: [1-1 or 0 to quit] 0 +~~~ + +Rebootez la machine pour que les modifications prennent effet ! \ No newline at end of file diff --git a/NetApp.md b/NetApp.md new file mode 100644 index 00000000..c3c3cf0e --- /dev/null +++ b/NetApp.md @@ -0,0 +1,495 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto NetApp + + + + + + + + + + + +## Configuration minicom pour accéder à la carte BMC + +/etc/minicom/minirc.netapp : + +~~~ +pu port /dev/ttyS0 +pu baudrate 9600 +pu bits 8 +pu parity N +pu stopbits 1 +pu rtscts No +~~~ + +## Configuration NetApp + +La commande `options` permet de voir, mais aussi changer à chaud les paramètres ! + +~~~ +# Pour voir toutes les options +netapp> options +auditlog.enable on +[...] + +# Pour voir certaines options : +netapp> options autosupport +netapp> options cifs +netapp> options disk +netapp> options ftpd +netapp> options +netapp> options ip +netapp> options iscsi +netapp> options ldap +netapp> options nfs +netapp> options raidsecurity +netapp> options sftp +netapp> options snapmirror +netapp> options ssh +netapp> options timed +netapp> options vol +netapp> options wafl +etc. + +# Pour voir une option particulière +netapp> options ip.v6.enable +ip.v6.enable off + +# Certaines options "dangereuses" nécessitent de passer dans un mode avancé... +netapp> priv set advanced +# ...et pour revenir dans un mode normal +netapp> priv set admin + +# Pour changer une option particulière +netapp> options ip.v6.enable on +~~~ + +Pour information, toutes les options sont stockées dans le fichier `/etc/registry` + +Une fois changée, l'option est immédiatement changée ! Son action est donc immédiate, ou +parfois il faut redémarrer un service. Dans tous les cas, il n'est donc pas nécessaire d'exécuter +une commande supplémentaire pour les conserver au prochain reboot. + +Enfin, certains paramètres se configurent via des fichiers (`resolv.conf`, etc.) et l'on rappelle +qu'il est fastidieux d'éditer un fichier directement en console (commande `wrfile`). +Une solution est d'avoir un montage en écriture NFS du vol0... + +## Administration réseau + + + +* Lister les interfaces réseau / routes : +~~~ +netapp> ifconfig -a +netapp> route -s +~~~ + +* Configuration IP "temporaire" : +~~~ +netapp> ifconfig bond0 192.0.2.3 netmask 255.255.255.128 +netapp> route add default 192.0.2.127 1 + +netapp> ifconfig bond0 alias 10.0.0.3 netmask 255.255.255.0 # ajouter un alias +netapp> ifconfig bond0 -alias 10.0.0.3 # supprimer un alias +~~~ + +* Configuration IP "en dur" : + +Cela se positionne dans le fichier `/etc/rc` : + +~~~ +netapp> rdfile /etc/rc +hostname myhostname +ifconfig e0a 192.0.2.3 netmask 255.255.255.128 mtusize 1500 +route add default 192.0.2.127 1 +routed off +options dns.domainname example.local +options dns.enable on +options nis.enable off +savecore +~~~ + +Note : on rencontrera parfois une configuration mentionnant `ifconfig e0a `hostname`-e0a` +ce qui est tout à fait possible avec un fichier `/etc/hosts` du type : + +~~~ +netapp> rdfile /etc/hosts +127.0.0.1 localhost localhost-stack +127.0.10.1 localhost-10 localhost-bsd +127.0.20.1 localhost-20 localhost-sk +192.0.2.3 myhostname-e0a +~~~ + +* Configuration DNS +~~~ +netapp> rdfile /etc/resolv.conf +netapp> options dns.enable on +netapp> options dns.domainname example.local + +netapp> dns info +~~~ + +* Stats réseau : +~~~ +netapp> ifstat bond0 + +-- interface bond0 (6 hours, 48 minutes, 21 seconds) -- + +RECEIVE + Total frames: 857k | Frames/second: 5 | Total bytes: 61585k + Bytes/second: 440 | Multi/broadcast: 40625 +TRANSMIT + Total frames: 314k | Frames/second: 4 | Total bytes: 1943m + Bytes/second: 348 | Multi/broadcast: 14597 +~~~ + +* Création d'un bonding (aggrégat d'interface réseau) simple : +~~~ +netapp> ifgrp create bond0 single e0a e0c +netapp> ifconfig bond0 192.0.2.3 netmask 255.255.255.128 mtusize 1500 +~~~ + +Note : à positionner dans le fichier `/etc/rc`. + +* Création d'un bonding LACP : +~~~ +netapp> ifgrp create bond0 lacp e0a e0c +~~~ + +* Création d'un "double-bonding" avec priorisation (utile pour avoir 2x 2 interfaces sur 2 switchs distincts) : + +~~~ +netapp> ifgrp create bond-foo lacp e0a e0c +netapp> ifgrp create bond-bar lacp e0b e0d +netapp> ifgrp create bond0 single bond-foo bond-bar +netapp> ifgrp favor bond-foo +~~~ + +* Diagnostics divers : +~~~ +netapp> ping +netapp> traceroute +netapp> arp -a +~~~ + +* VLAN : commande `vlan` + +## Administration système + +* Version de l'OS (Data ONTAP) : +~~~ +netapp> version +NetApp Release 8.1 7-Mode: Thu Mar 29 13:56:17 PDT 2012 +~~~ + +* Uptime: +~~~ +netapp> uptime + 9:01pm up 5:09 88 NFS ops, 53 CIFS ops, 0 HTTP ops, 0 FCP ops, 0 iSCSI ops +~~~ + +* Aide : +~~~ +netapp> help +netapp> help +~~~ + +* Date : +~~~ +netapp> date +Mon Sep 3 20:53:39 CEST 2012 +~~~ + +* Activer/changer le(s) serveur(s) NTP : +~~~ +netapp> options timed.enable on +netapp> options timed.servers 192.0.2.1 +~~~ + +* Accès à l'admin HTTP FilerView via : +* Afficher le contenu d'un fichier (équivalent de `cat`) : +~~~ +netapp> rdfile +~~~ + +* Écrire un fichier (ATTENTION CELA EFFACE LE CONTENU EXISTANT) : +~~~ +netapp> wrfile +~~~ + +* Lister le contenu d'un répertoire (attention, plus compliqué !) : +~~~ +netapp> priv set advanced +netapp> ls +~~~ + +* Paramètres pour l'autosupport (envoi d'emails hebdomadaires récpitulatifs) : +~~~ +netapp> options autosupport.enable on +netapp> options autosupport.cifs.verbose on +netapp> options autosupport.mailhost 192.0.2.1 +netapp> options autosupport.to test@example.com +netapp> options autosupport.support.transport smtp +~~~ + +* Forcer l'envoi d'un email récapitulatif : +~~~ +netapp> options autosupport.doit test +~~~ + +* Statistiques diverses : +~~~ +netapp> stats show +netapp> cifs stat +netapp> nfs stat +~~~ + +## Administration des storages + +* Lister la taille des volumes existants (dont snapshot) : +~~~ +netapp> df -h +Filesystem total used avail capacity Mounted on +/vol/vol0/ 151GB 4784MB 146GB 3% /vol/vol0/ +/vol/vol0/.snapshot 8140MB 668MB 7471MB 8% /vol/vol0/.snapshot +/vol/foo/ 9728GB 364MB 9727GB 0% /vol/foo/ +/vol/foo/.snapshot 512GB 1533MB 510GB 0% /vol/foo/.snapshot +~~~ + +* Lister les options des volumes existants : +~~~ +netapp> vol status + Volume State Status Options + vol0 online raid_dp, flex root, create_ucode=on + 64-bit + foo online raid_dp, flex create_ucode=on + 64-bit +~~~ + +* Lister les QTREE existants : +~~~ +netapp> qtree status +Volume Tree Style Oplocks Status +-------- -------- ----- -------- --------- +vol0 unix enabled normal +foo unix enabled normal +foo bar unix enabled normal +foo commun unix enabled normal +foo partages unix enabled normal +foo users unix enabled normal +~~~ + +* Lister les exports NFS : +~~~ +netapp> exportfs +/vol/foo/bar -sec=sys,rw,root=192.0.2.1:192.0.2.2,nosuid +/vol/vol0 -sec=sys,ro,rw=192.0.2.1:192.0.2.2,root=192.0.2.1:192.0.2.2,nosuid +~~~ + +* Stats NFS : +~~~ +netapp> nfsstat +~~~ + +* Modifier les exports NFS : + +Éditer le fichier `/etc/exports` puis : +~~~ +netapp> exportfs -a +~~~ + +* Lister les exports CIFS : +~~~ +netapp> cifs shares +Name Mount Point Description +---- ----------- ----------- +ETC$ /etc Remote Administration + BUILTIN\Administrators / Full Control +C$ / Remote Administration + BUILTIN\Administrators / Full Control +[...] +~~~ + +* Lister les sessions CIFS ouvertes : +~~~ +netapp> cifs sessions +[...] +~~~ + +* Créer un partage CIFS : +~~~ +netapp> cifs shares -add test /vol/foo/bar +netapp> cifs access -delete test everyone +1 share(s) have been successfully modified +netapp> cifs access test -g unixgroup "Full Control" +1 share(s) have been successfully modified +netapp> cifs access test -g DOMAIN\wingroup "Full Control" +1 share(s) have been successfully modified +~~~ + +* Lister les snapshots d'un volume : +~~~ +netapp> snap list vol0 +Volume vol0 +working... + + %/used %/total date name +---------- ---------- ------------ -------- + 2% ( 2%) 0% ( 0%) Sep 03 20:00 hourly.0 + 4% ( 2%) 0% ( 0%) Sep 03 16:00 hourly.1 + 6% ( 2%) 0% ( 0%) Sep 03 12:11 hourly.2 + 7% ( 2%) 0% ( 0%) Sep 03 08:00 hourly.3 + 9% ( 2%) 0% ( 0%) Sep 03 00:01 nightly.0 + 11% ( 2%) 0% ( 0%) Sep 02 20:00 hourly.4 + 12% ( 2%) 0% ( 0%) Sep 02 16:00 hourly.5 + 15% ( 3%) 0% ( 0%) Sep 02 00:00 nightly.1 +~~~ + +## Administration LDAP + +Il s'agit ici d'aller récupérer les utilisateurs sur un annuaire LDAP distant. + +~~~ +netapp> options ldap + +netapp> options ldap.base dc=example,dc=com +netapp> options ldap.name cn=netapp,dc=example,dc=com +netapp> options ldap.passwd ****** +netapp> options ldap.servers 192.0.2.1 +netapp> options ldap.enable on +netapp> options ldap.usermap.enable on # pour gérer des associations login windows <=> login UNIX via /etc/usermap.cfg + +netapp> priv set advanced +netapp> getXXbyYY getpwbyname_r +netapp> priv set admin +netapp> wcc -u # liste des infos Unix sur un compte +netapp> wcc -s # liste des infos Windows sur un compte +~~~ + +Utilisation de 2 serveurs LDAP (failover) : + +~~~ +netapp> options.ldap.servers=192.0.2.1 192.0.2.2 +~~~ + +## Gestion des permissions pour Unix/Windows/MAC + +Sous NetApp, il existe plusieurs types de permissions : ntfs, unix ou mixed. +On les positionne sur un qtree et c'est un point très important pour la gestion des droits. + + + + + +### Mode Unix + +Le NetApp stocke les droits en mode rwxrwxrwx ; c'est évidemment adapté pour des accès +via NFS depuis des clients Linux, mais également pour des accès via CIFS si les droits +restent pensés en mode Unix : permissions uniquement pour un utilisateur ou un groupe +(dans lequel seront tous les utilisateurs nécessitant des accès). + +Via CIFS, les utilisateurs/groupes doivent être "mappés" (via LDAP ou manuellement dans le fichier +[usermap.cfg](http://www.wafl.co.uk/usermapcfg/)) + +### Mode NTFS + +Le NetApp stocke les droits en mode NTFS uniquement. Toutes les opérations réalisées sous Linux/Unix (en NFS) seront "ignorées" : + +~~~ +# ls -l +drwxrwxrwx 6 root root 4096 Oct 19 10:57 data +# chown foo:bar data +# cmod 750 data +# ls -l +drwxrwxrwx 6 root root 4096 Oct 19 10:57 data +~~~ + + +### Mode Mixed + +Le NetApp peut stocker les droits en mode Unix OU en mode Windows : attention, c'est l'un OU l'autre ! (cette notion est importante). + +Ce mode est parfois déconseillé car il peut devenir un véritable casse-tête si l'on s'organise mal. +Il permet néanmoins une certaine compatibilité lorsque l'on utilise des clients NFS ET CIFS. + +Voici les avantages par rappport au mode NTFS : + +* dans un Qtree, pouvoir avoir certains répertoires avec des ACLs NTFS, et d'autres répertoires avec des droits pur Unix +* si il y a une migration de données depuis un serveur Linux/Unix, les droits rwxrwxrwx seront conservés +* pouvoir agir sur les données depuis Linux/Unix, par exemple pour réinitialiser des ACLs Windows (chown/chmod -R), + alors que ce n'est pas possible en mode NTFS (le NetApp ignorera "lâchement" les commandes envoyées). + +Voici comment nous l'utilisons : + +* Partager le qtree Mixed (CIFS) en mettant des droits "Full Control" pour everyone (ou DOMAIN\Utilisa. du domaine) +* Sous Windows, avec un utilisateur du domaine, on crée un répertoire en ajustant les ACLs sur les utilisateurs/groupes + et en supprimant les droits pour everyone (en désactivant les droits hérités du parent dans la gestion avancée des droits) +* sur le répertoire du qtree, on met les droits Unix suivants : chgrp 512 + chmod 775 afin de permettre aux Administrateurs + du domaine de créer des répertoires avec les ACLs kivonbiens, et de permettre au reste du monde de le traverser mais sans pouvoir + créer de fichiers/répertoires à la racine du partage. + +Notes : +* En NFS, les droits visibles des fichiers/répertoires avec des ACLs NTFS sont farfelus (700, 777, etc.)... mais on peut se contenter de les ignorer : ça marche ! +* En CIFS, les droits visibles des fichiers/répertoires avec des droits Unix sont farfelus (owner, root, etc.)... mais on peut se contenter de les ignorer : ça marche ! +* ATTENTION, modifier les droits sous Linux/Unix (en NFS) revient à perdre les ACLs positionnés sous Windows +* Sauf cas très particuliers, on doit éviter de toucher aux droits sous Linux/Unix (car ça peut devenir un casse-tête si l'on est dans un répertoire avec des ACLs NTFS) +* Sous Windows, il faut parfois (souvent!) "forcer" les droits via la gestion avancée des droits +* Si l'on veut passer la sécurité de fichiers/répertoires d'Unix à NTFS, 777 ne suffit pas, il faut mettre le bon propriétaire (chown/chgrp) sous Unix afin d'avoir les droits de positionner les ACLs sous Windows avec l'utilisateur correspondant (à confirmer) + +Options diverses : + +* Export NFS : option _root=IP_ permet d'avoir un accès root depuis certains postes (dangereux... mais utile) +* Option _cifs.nfs_root_ignore_acl_ permet de donner un accès total à root sans tenir compte des ACLs (utile ! mais rappel: éviter de modifier les droits en root pour le mode Mixed) +* Option _cifs.preserve_unix_security_ permet de considérer les droits Unix comme prioritaire et de les afficher dans les droits avancés sous Windows ! +* Options _wafl_ (Write Anywhere File Layout) intéressantes : default_nt_user, default_qtree_mode, default_security_style, default_unix_user, group_cp, nt_admin_priv_map_to_root, root_only_chown + +Pour voir quel est le mode de sécurité d'un fichier/répertoire et ses droits associés sur NetApp : + +~~~ +netapp> fsecurity show -v vol +[/vol/vol/path - Directory (inum 17388)] + Security style: Mixed + Effective style: Unix + + DOS attributes: 0x0010 (----D---) + + Unix security: + uid: 0 (root) + gid: 512 (smbadmins) + mode: 0775 (rwxrwxr-x) + + No security descriptor available. +netapp> fsecurity show -v vol +[/vol/vol/path - Directory (inum 17392)] + Security style: Mixed + Effective style: NTFS + + DOS attributes: 0x0030 (---AD---) + + Unix security: + uid: 10072 (foo) + gid: 512 (smbadmins) + mode: 0777 (rwxrwxrwx) + + NTFS security descriptor: + Owner: BUILTIN\Administrators + Group: DOMAINE\Administrateurs du domaine + DACL: + Allow - Everyone - 0x001200a9 (Read and Execute) - OI|CI + Allow - DOMAINE\foo - 0x001f01ff (Full Control) - OI|CI + Allow - DOMAINE\bar - 0x001301bf (Modify) - OI|CI +~~~ + +## FAQ + +J'essaye de me connecter en SSH au NetApp et j'obtiens : +~~~ +debug1: Authentication succeeded (password) +Connection to 1.2.3.4 closed. +~~~ + +Une seule connexion SSH est autorisée par défaut. +Soit il y a déjà une connexion en cours, soit une précédente connexion a mal été fermée (il faut attendre environ 15 minutes pour le timeout). diff --git a/OpenBSD.md b/OpenBSD.md new file mode 100644 index 00000000..c808de2e --- /dev/null +++ b/OpenBSD.md @@ -0,0 +1,22 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +*Soucis lié à l'ACPI sur Dell R220* + +Pour désactiver l'ACPI au démarage : + +~~~ +boot> boot -c +... +UKC> disable acpi +UKC> quit/ +~~~ + +Puis pour le désactiver définitivement : + +~~~ +# config -ef /bsd +Enter 'help' for information +ukc> disable acpi +ukc> quit +Saving modified kernel. +~~~ \ No newline at end of file diff --git a/OpenIndiana.md b/OpenIndiana.md new file mode 100644 index 00000000..a3e5ff42 --- /dev/null +++ b/OpenIndiana.md @@ -0,0 +1,2 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + diff --git a/PowerVault.md b/PowerVault.md new file mode 100644 index 00000000..bdb06011 --- /dev/null +++ b/PowerVault.md @@ -0,0 +1,54 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## PowerVault 3600i + +### Client Linux + +Le SAN n'est pas administrable par telnet, ssh, ou une interface web. +Il est donc obligatoire de passer par le client lourd de Dell, heureusement disponible pour Linux. + +~~~ +... +~~~ + +Le client utilise une forme d'auto-découverte des SAN disponibles sur le réseau, si plusieurs SAN sont présents, +il est possible de les faire clignoter un par un pour les identifier physiquement. + +### Configuration + +Le SAN récupère par défaut une IP en DHCP, il est ensuite possible de le paramétrer en IP fixe. +A partir du logiciel de gestion SMClient, sélectionner le SAN concerné, puis dans l'onglet configuration, +ouvrir la section "Configurer les ports de gestion Ethernet". Il est alors possible de configurer les +paramètres réseau de l'interface de gestion. + +Une fois les volume logiques créés, il faut créer des hôtes ou des groupes d'hôtes dans l'onglet Adressage +afin de pouvoir y associer les volumes. +Les hôtes déjà connectés au SAN seront visible dans les menus de configuration, ce qui évite de devoir entrer +l'identifiant manuellement. +Lors de la création des hôtes, il faut que chaque nom soit unique. +Il est alors possible d'associer les volumes à un ou plusieurs hôtes, afin de les rendre visible comme des disques +locaux. + +### Arrêt + +Pour arrêter le SAN, pas la peine de chercher des heures dans l'interface de gestion, il faut arrêter ou +déconnecter tous les hôtes utilisant les volumes montés sur le SAN et ensuite éteindre électriquement ce +dernier. + +Il est possible de forcer la déconnexion des hôtes iSCSI dans l'interface de gestion : [[BR]] + *Attention, cela revient à débrancher un disque en cours d'utilisation*[[BR]] + Sur l'utilitaire de gestion, dans la fenêtre du SAN concerné, menu "Matrice de stockage", puis "iSCSI" et + enfin "Terminer les sessions". + +### Problèmes divers + +Les interfaces iSCSI ne répondent pas (les diodes des ports Ethernet ne sont pas allumées) : + Le SAN s'attend par défaut à être sur un réseau 10Gigabits, il faut donc forcer le Gigabits simple. + Suite à un bug dans la version du manager qui nous était fournie il faut passer la langue de l'OS en + anglais avant de relancer MDSM. Une fenêtre de configuration des interfaces iSCSI devrait apparaitre + et permettre la modification des débits. + +Le SAN ventile à fond/fait un bruit énorme : + Vérifier que les deux alimentations soient branchées et allumées. + Le SAN utilise les ventilateurs des alimentations comme extraction, si les deux ne sont pas actives, + il augmente la vitesse de celle restante pour éviter la surchauffe. diff --git a/RAIDAAC.md b/RAIDAAC.md new file mode 100644 index 00000000..d2375261 --- /dev/null +++ b/RAIDAAC.md @@ -0,0 +1,3 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +http://hwraid.le-vert.net/wiki/Adaptec \ No newline at end of file diff --git a/RAIDAdaptecSeries7.md b/RAIDAdaptecSeries7.md new file mode 100644 index 00000000..a1bf536a --- /dev/null +++ b/RAIDAdaptecSeries7.md @@ -0,0 +1,21 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + += Adaptec Series 7= + +## Check Raid + +Utiliser le aacraid-status de hw-raid : +Télécharger arcconf : +Dézipper et copier arcconf dans /usr/sbin +Patcher aacraid-status : + + +Résumé : + +~~~ +# wget +# unzip arcconf_v1_8_21375.zip -d arcconf +# install -m755 arcconf/linux_x64/cmdline/arcconf /usr/sbin/ +# wget -O /tmp/aacraid-status.patch +# patch /usr/sbin/aacraid-status < /tmp/aacraid-status.patch +~~~ \ No newline at end of file diff --git a/ServeurAmazonEC2.md b/ServeurAmazonEC2.md new file mode 100644 index 00000000..f24b658a --- /dev/null +++ b/ServeurAmazonEC2.md @@ -0,0 +1,217 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Serveurs Amazon EC2 + +* +* +* +* + +### Installation de l'API d'Amazon EC2 + +l'API Tools d'Amazon EC2 permet de gérer ses instances, AMI, etc… en ligne de commande. + +Voici la procédure à appliquer pour l'installation des outils : + +* Télécharger l'archive depuis cette page : +* Générer un couple certificat/clé privée depuis l'interface d'Amazon, qui permettra de s'authentifier sur le service : + "Account" > "Identifiants de sécurité" > Onglet "Certificats X.509" > "Créer un nouveau certificat" et télécharger le certificat et la clé publique +* Placer le certificat et la clé privée à la racine du répertoire de l'API, une fois celui-ci décompressé +* Indiquer ensuite diverses informations dans les variables d'environnement, qu'on pourra placer dans son _.profile_ : +~~~ +export EC2_HOME=~/ec2 +export EC2_PRIVATE_KEY=pk-YOURKEYNAME.pem +export EC2_CERT=cert-YOURKEYNAME.pem +export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.22/jre/ +# accessoirement : +export EC2_URL= +~~~ + +* On peut tester que l'installation de l'API est correcte en listant par exemple les AMI disponible : +~~~ +bin/ec2-describe-images -a +~~~ +NOTE : pour exécuter les commandes EC2, il faut se trouver à la racine du répertoire d'installation. + +### Stocker une AMI sur un EBS + +Voici la procédure à suivre : + +* Démarrer une instance de l'AMI : +~~~ +ec2-run-instances --instance-type m1.large --kernel aki-9800e5f1 ami-xxxxxx +~~~ + +* Créer un nouveau volume, de même taille que l'AMI, puis l'attacher à l'instance : +~~~ +ec2-create-volume --size 10 +ec2-attach-volume vol-xxxxxx --instance i-xxxxxx --device /dev/sdf +~~~ + +* Depuis l'instance, copier l'intégralité de l'AMI sur le volume : +~~~ +# Un peu violent mais ça semble marcher. +# Un meilleure méthode serait peut-être de faire un « unbundle » de l'AMI et de la copier sur /dev/sdf. + +# Éteindre un maximum de services pour limiter les écritures sur le disque +dd if=/dev/sda1 of=/dev/sdf +fsck /dev/sdf +~~~ + +* Détacher le volume le volume, et terminer l'instance : +~~~ +ec2-detach-volume vol-xxxxxx --instance i-xxxxxx +ec2-terminate-instances i-xxxxxx +~~~ + +* Faire une snapshot du volume : +~~~ +ec2-create-snapshot vol-xxxxxx +~~~ + +* Enregistrer le snapshot en tant qu'AMI : +~~~ +ec2-register --name -a x86_64 --root-device-name /dev/sda1 --block-device-mapping /dev/sda1=snap-xxxxxx +~~~ + +* Démarrer enfin une instance de cette nouvelle AMI : +~~~ +ec2-run-instances --instance-type m1.large --kernel aki-9800e5f1 ami-xxxxxx +ec2-associate-address -i i-xxxxxx +~~~ + +### Rendre publique une AMI + +TODO + +### Partager une AMI Amazon EC2 + +En tant qu'utilisateur du service EC2 d'Amazon, on peut être amené à vouloir partager ses AMI (Amazon Machine Image) avec d'autres utilisateurs (amis, clients, etc) qui utilisent donc un autre compte Amazon. La procédure pour cela est très simple, et directement intégré à l'interface web : + +* En premier lieu, il est nécessaire de connaître le Account Number du compte qui aura accès à notre AMI (il ne s'agit de l'email utilisé pour s'identifier). On trouvera cela dans Your account > Personal Information, en haut à droite de la page. +* Ensuite, il suffit de faire un clic droit sur notre AMI dans la vue correspondante, de sélectionner Edit permissions et d'ajouter un ou plusieurs Account Number dans les champs prévus à cet effet. +* Sur l'autre compte, l'AMI sera alors accessible dans la catégorie Private images. + +### Gérer plusieurs sous-comptes sur Amazon AWS avec IAM + +* +* + +IAM est un module qui permet de créer des sous-comptes (et même des groupes) et de leur donner des permissions spécifiques. +On peut ainsi créer plusieurs sous-comptes ayant un accès total, ou uniquement des permissions spécifiques (accès à certains modules : EC2, S3, etc. en read-only ou full access). + +Ces utilisateurs peuvent avoir un access key (pour accéder à l'API Amazon AWS) et/ou un mot de passe (pour l'accès web). + +Pour l'accès web, cela se passe sur une URL spécifique qui est : + +### Migrer une instance EBS d'un compte à un autre + +La migration de l'instance ne se fait pas correctement, il est nécessaire de migrer le snapshot puis de recréer l'instance sur le nouveau compte. +Vous devez au préalable snapshoter le volume de l'instance, et partager cette snapshot avec l'ID du nouveau compte (cf. « Partager une AMI Amazon EC2 », en adaptant aux snapshots). + +Voici la procédure à suivre, avec $EC2_CERT et $EC2_PRIVATE_KEY contenant les clés du nouveau compte : + +* Tout d'abord on ne peux pas avoir une instance qui utilise une snapshot partagée, il faut donc créer un volume à partir de cette snapshot, puis snapshoter ce volume : +~~~ +bin/ec2-create-volume --size 10 --availability-zone us-east-1b --snapshot snap-xxxxxxxx +bin/ec2-create-snapshot vol-xxxxxxxx +~~~ + +* Créez ensuite l'instance à partir de la snapshot : +~~~ +bin/ec2-register --name -a x86_64 --root-device-name /dev/sda1 --block-device-mapping /dev/sda1=snap-xxxxxxxx +~~~ + +* Démarrez la nouvelle instance et assignez lui une nouvelle IP : +~~~ +bin/ec2-run-instances --instance-type m1.large --kernel aki-9800e5f1 ami-xxxxxxxx +bin/ec2-associate-address -i i-xxxxxxxx +~~~ + +### Création d'une AMI + +À compléter suivant + +#### Installation des modules noyau + +* Récupérez les modules pour votre noyau : +~~~ +wget +~~~ + +* Décompressez l'archive à la racine du système : +~~~ +tar xzf /tmp/ec2-modules-2.6.18-xenU-ec2-v1.0-x86_64.tgz -C / +~~~ + +L'archive fournit le fichier vmlinuz, les modules .ko, et le /boot/System.map. + +### Failed to execute /init Kernel panic + +En cas de kernel panic suite à un reboot. + + +~~~ +[ 0.967754] Freeing unused kernel memory: 688k freed +[ 0.971012] Failed to execute /init +[ 0.973212] Kernel panic - not syncing: No init found. Try passing init= option to kernel. See Linux Documentation/init.txt for guidance. +[ 0.980516] Pid: 1, comm: swapper/0 Not tainted 3.2.0-4-amd64 #1 Debian 3.2.65-1+deb7u2 +[ 0.985497] Call Trace: +~~~ + +L'initramfs est corrompue. Pour corriger ceci : + +* L'arrêter ;[[BR]] +* Détacher son EBS ;[[BR]] +* Attacher son EBS sur une machine OK en disque secondaire (xvdf).[[BR]] + + +~~~ +# mount /dev/xvdf /mnt/ +# mount -t proc none /mnt/proc +# mount -o bind /dev /mnt/dev +# mount -o bind /dev/pts /mnt/dev/pts +# mount -t sysfs sys /mnt/sys +# chroot /mnt/ /bin/bash +# dpkg-reconfigure linux-image-3.2.0-4-amd64 +# exit +# umount /mnt/dev/pts +# umount /mnt/dev +# umount /mnt/proc +# umount /mnt/sys +# umount /mnt +~~~ + +* Détacher l'ebs de la machine de rescue ;[[BR]] +* Attacher l'ebs sur la machine planté (xvda) ;[[BR]] +* Démarrer la VM. + +Pour éviter que l'initramfs soit corrompue, lors d'un upgrade kernel, il faut s'assurer que /var/tmp soit bien en exec : + +~~~ +mount -oremount,exec /var/tmp +dpkg-reconfigure linux-image-3.2.0-4-amd64 +~~~ + +## Configuration SSH +* !!!!!! ATTENTION !!!!! * + +Par défaut, le serveur SSH est configuré globalement avec le paramètre: +~~~ +PasswordAuthentication no +~~~ + +* Cette ligne doit être commentée! * + +## Screenshot via AWS + +Via l'interface web AWS, on a accès à un screenshot de l'écran actuel de la VM (en read-only). + +Attention ! Il faut se méfier de ce screenshot qui peut ne pas réfléter l'état réel de la machine... exemple typique au démarrage d'une machine, vous verrez l'écran du "BIOS QEMU" avec "Loading initial ramdisk ..." +pourtant la VM n'est pas forcément dans cet état, il est probable qu'en fait elle est en cours de boot ou pire, que son boot a échoué pour une raison ou une autre POURTANT VOUS NE VERREZ PAS CELA SUR LE SCREENSHOT !! + +## FAQ + +### Test accessibilité réseau + +Pour vérifier l'accès à Amazon : et vérifier l'affichage de l'icône "vert". diff --git a/ServeurDELL.md b/ServeurDELL.md new file mode 100644 index 00000000..e7e394b0 --- /dev/null +++ b/ServeurDELL.md @@ -0,0 +1,44 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Serveur DELL + +Serveurs DELL PowerEdge. + +## Disques SSD + + + +### SSD DELL Value (SATA MLC) + +Bullshit DELL : "Les disques durs SSD SATA 2,5 pouces Dell Value sont adaptés aux clients dotés de charges de travail mixtes, telles qu'applications d'entreposage de données, de bureau virtuel et HPC. Ils sont disponibles avec des capacités de 100 Go et de 200 Go, et ils ont été conçus pour être compatibles avec les serveurs Dell et pour s'y intégrer facilement." + + + +Il s'agit de disques Samsung : + + + + + +### SSD DELL Mainstream (SAS SLC) + +Bullshit DELL : "Les disques durs SSD SAS 2,5 pouces Dell Mainstream sont une bonne solution pour les clients qui gèrent des bases de données OLTP (Online Transactional Processing), des systèmes d'aide à la décision pour les entreprises et des applications de mise en mémoire cache des données, des utilisations susceptibles de traiter des charges de travail en écriture extrêmement intensives. Ces disques sont disponibles avec des capacités de 200 Go et de 400 Go. Ils ont été conçus pour être compatibles et s'intégrer facilement avec les systèmes de stockage d'entreprise de niveau 0 (existants ou nouveaux) notamment les serveurs, les systèmes de stockage à connexion directe et les solutions de stockage en réseau." + +Il s'agit de disques Sandisk / Pliant : / + +### SSD Fusion-IO + + + + +### Bios Update + +Pour mettre à jour le bios, il faut télécharger la dernière version disponible sur la page de l'appareil sur le site de Dell. [[BR]] +Prendre le .exe bios-executable[[BR]] +Ex : [[BR]] +Telecharger FreeDos sur . Prendre la version correspondant à la taille de la clé usb qui sera utilisée.[[BR]] +Décompresser l'archive. Par exemple : bunzip2 FreeDOS-1.1-memstick-2-256.img.bz2 .[[BR]] +Utiliser dd pour copier l'image sur la clé comme suit : dd i=/FreeDOS-1.1-memstick-2-256.img of=/dev/sdx bs=512k .[[BR]] +Placer le .exe téléchargé précedemment sur la racine de la clé usb.[[BR]] +Grâce au boot menu de la machine, boot sur le clé. Lorsqu'il le sera demandé, selectionner de boot sur FreeDOS sans drivers.[[BR]] +Lorsque le prompt DOS sera affiché, entrer le nom du .exe et suivre les instructions à l'écran. diff --git a/ServeurDELL/PERC.md b/ServeurDELL/PERC.md new file mode 100644 index 00000000..5b2678cf --- /dev/null +++ b/ServeurDELL/PERC.md @@ -0,0 +1,325 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + + + + +## Remplacement d'un disque HS + +Vous avez un disque HS, par exemple le disque 0, qui clignote. +Vous constatez ainsi le *Firmware state: Failed* : + +~~~ +# /opt/MegaCli -PDList -a0 + +Adapter #0 + +Enclosure Device ID: 32 +Slot Number: 0 +Device Id: 0 +Sequence Number: 2 +Media Error Count: 0 +Other Error Count: 0 +Predictive Failure Count: 0 +Last Predictive Failure Event Seq Number: 0 +Raw Size: 70007MB [0x88bb93a Sectors] +Non Coerced Size: 69495MB [0x87bb93a Sectors] +Coerced Size: 69376MB [0x8780000 Sectors] +Firmware state: Failed +SAS Address(0): 0x5000c5000b0b1c51 +SAS Address(1): 0x0 +Connected Port Number: 0(path0) + +Enclosure Device ID: 32 +Slot Number: 1 +Device Id: 1 +Sequence Number: 2 +Media Error Count: 0 +Other Error Count: 0 +Predictive Failure Count: 0 +Last Predictive Failure Event Seq Number: 0 +Raw Size: 70007MB [0x88bb93a Sectors] +Non Coerced Size: 69495MB [0x87bb93a Sectors] +Coerced Size: 69376MB [0x8780000 Sectors] +Firmware state: Online +SAS Address(0): 0x5000c5000b0b4355 +SAS Address(1): 0x0 +Connected Port Number: 1(path0) +~~~ + +Vous le remplacez à chaud... et vous constatez qu'il ne se reconstruit pas tout seul. +Pas de panique. Notez déjà qu'il est possible que le nouveau disque +apparaissent deux fois, une fois en _Firmware state: Unconfigured(bad)_ +et une autre en _Firmware state: Unconfigured(good)_ : + +~~~ +Enclosure Device ID: 32 +Slot Number: 0 +Device Id: 0 +Sequence Number: 2 +Media Error Count: 0 +Other Error Count: 0 +Predictive Failure Count: 0 +Last Predictive Failure Event Seq Number: 0 +Raw Size: 0MB [0x0 Sectors] +Non Coerced Size: 9007199254740480MB [0xfffffffffff00000 Sectors] +Coerced Size: 0MB [0x0 Sectors] +Firmware state: Unconfigured(bad) +SAS Address(0): 0x5000c5002c5d18b5 +SAS Address(1): 0x0 +Connected Port Number: 0(path0) + +Enclosure Device ID: N/A +Slot Number: 33 +Device Id: 33 +Sequence Number: 1 +Media Error Count: 0 +Other Error Count: 0 +Predictive Failure Count: 0 +Last Predictive Failure Event Seq Number: 0 +Raw Size: 70007MB [0x88bb93a Sectors] +Non Coerced Size: 69495MB [0x87bb93a Sectors] +Coerced Size: 69376MB [0x8780000 Sectors] +Firmware state: Unconfigured(good) +SAS Address(0): 0x5000c5002c5d18b5 +SAS Address(1): 0x0 +Connected Port Number: 0(path0) +~~~ + +Après un petit reboot, seul *Firmware state: Unconfigured(good)* +subsiste. Vous avez ainsi : + +~~~ +# /opt/MegaCli -PDList -a0 + +Adapter #0 + +Enclosure Device ID: 32 +Slot Number: 0 +Device Id: 0 +Sequence Number: 1 +Media Error Count: 0 +Other Error Count: 0 +Predictive Failure Count: 0 +Last Predictive Failure Event Seq Number: 0 +Raw Size: 70007MB [0x88bb93a Sectors] +Non Coerced Size: 69495MB [0x87bb93a Sectors] +Coerced Size: 69376MB [0x8780000 Sectors] +Firmware state: Unconfigured(good) +SAS Address(0): 0x5000c5002c5d18b5 +SAS Address(1): 0x0 +Connected Port Number: 0(path0) + +Enclosure Device ID: 32 +Slot Number: 1 +Device Id: 1 +Sequence Number: 2 +Media Error Count: 0 +Other Error Count: 0 +Predictive Failure Count: 0 +Last Predictive Failure Event Seq Number: 0 +Raw Size: 70007MB [0x88bb93a Sectors] +Non Coerced Size: 69495MB [0x87bb93a Sectors] +Coerced Size: 69376MB [0x8780000 Sectors] +Firmware state: Online +SAS Address(0): 0x5000c5000b0b4355 +SAS Address(1): 0x0 +Connected Port Number: 1(path0) +~~~ + +On s'intéresse ensuite à notre volume RAID1 dans ce cas : + +~~~ +# /opt/MegaCli -CfgDsply -a0 + +============================================================================== +Adapter: 0 +Product Name: PERC 6/i Integrated +Memory: 256MB +BBU: Present +============================================================================== +Number of DISK GROUPS: 1 + +DISK GROUPS: 0 +Number of Spans: 1 +SPAN: 0 +Span Reference: 0x00 +Number of PDs: 2 +Number of VDs: 1 +Number of dedicated Hotspares: 0 +Virtual Disk Information: +Virtual Disk: 0 (target id: 0) +Name: +RAID Level: Primary-1, Secondary-0, RAID Level Qualifier-0 +Size:69376MB +State: Degraded +Stripe Size: 64kB +Number Of Drives:2 +Span Depth:1 +Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU +Current Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU +Access Policy: Read/Write +Disk Cache Policy: Disk's Default +Physical Disk Information: +Physical Disk: 0 +Physical Disk: 1 +Enclosure Device ID: 32 +Slot Number: 1 +Device Id: 1 +Sequence Number: 2 +Media Error Count: 0 +Other Error Count: 0 +Predictive Failure Count: 0 +Last Predictive Failure Event Seq Number: 0 +Raw Size: 70007MB [0x88bb93a Sectors] +Non Coerced Size: 69495MB [0x87bb93a Sectors] +Coerced Size: 69376MB [0x8780000 Sectors] +Firmware state: Online +SAS Address(0): 0x5000c5000b0b4355 +SAS Address(1): 0x0 +Connected Port Number: 1(path0) +~~~ + +On veut donc remplacer *Physical Disk: 0* (row = 0) +dans le *target id: 0* (array = 0) par notre nouveau disque +identifié comme étant *[32:0]* ce qui donne : + +~~~ +# /opt/MegaCli -PdReplaceMissing -PhysDrv [32:0] -array0 -row0 -a0 +Adapter: 0: Missing PD at Array 0, Row 0 is replaced. +~~~ + +Il devrait donc apparaître en *Firmware state: Offline*. +On lance enfin la reconstruction : + +~~~ +# /opt/MegaCli -PDRbld -Start -PhysDrv[32:0] -a0 +Started rebuild progress on device(Encl-32 Slot-0) +~~~ + +Il passe donc en *Firmware state: Rebuild*. +On peut suivre sa reconstruction via : + +~~~ +# /opt/MegaCli -PDRbld -ShowProg -PhysDrv [32:0] -aALL +Rebuild Progress on Device at Enclosure 32, Slot 0 Completed 28% in 3 Minutes. +~~~ + +Une fois terminé, il apparaît en *Firmware state: Online* +et les opérations sont terminées. + +* !!! ATTENTION !!! ATTENTION !!! ATTENTION !!! * + +L'erreur fatale à ne pas commettre lorsque vous constatez un disque +en état _Firmware state: Failed_ est de le forcer à revenir _Online_. +En effet, cela force à repasser en mode RAID sans reconstruction et vous pouvez +dire adieu à votre système de fichiers. NE FAITES DONC *PAS* : + +~~~ +# /opt/MegaCli_ATTENTION -PDOnline -PhysDrv [32:0] -a0 +EnclId-32 SlotId-0 state changed to OnLine. +~~~ + +Identifier un disque physiquement (faire clinoter la LED) : +~~~ +/opt/MegaCli -PdLocate start -physdrv[:] -a0 +~~~ + +## Ajout d'un disque dans un volume RAID5 + +Avoir un système avec la commande *omconfig*, par exemple, booter sur un Live-CD DELL OMSA (rappel, par défaut: login=root password=calvin) +télchargeable sur + +Pour connaître l'état des disques/volumes on utilisera *omreport* : + +~~~ +# omreport storage vdisk controller=0 +# omreport storage pdisk controller=0 +~~~ + +Et voilà un exemple qui ajoute un disque (ici 1:0:5) sur un volume existant. + +~~~ +# omconfig storage vdisk action=reconfigure controller=0 vdisk=0 raid=r5 pdisk=0:0:0,0:0:1,0:0:2,0:0:3,1:0:5 +Command successful! +~~~ + +Suite à cela, une loooongue phase de reconstruction du volume RAID. + +## Performances + +Si les performances lors d'un benchmark avec le cache FS désactivé sont ridicules (voir HowtoBenchmarks), il est possible que le cache du controlleur ne soit pas activé. +Dans ce cas, si le controlleur dispose d'une mémoire cache ET d'une batterie, on peut l'activer : +~~~ +# /opt/MegaCli -AdpBbuCmd -GetBbuStatus -a0 | grep -e '^isSOHGood' -e '^Charger Status' -e '^Remaining Capacity' +Charger Status: Complete +Remaining Capacity: 1640 mAh +isSOHGood: Yes +~~~ + +La batterie est bonne, on peut l'activer : +~~~ +# /opt/MegaCli -LDSetProp -Cached -LAll -aAll + +Set Cache Policy to Cached on Adapter 0, VD 0 (target id: 0) success +Set Cache Policy to Cached on Adapter 0, VD 1 (target id: 1) success + +Exit Code: 0x00 +# /opt/MegaCli -LDSetProp EnDskCache -LAll -aAll + +Set Disk Cache Policy to Enabled on Adapter 0, VD 0 (target id: 0) success +Set Disk Cache Policy to Enabled on Adapter 0, VD 1 (target id: 1) success + +Exit Code: 0x00 +# /opt/MegaCli -LDSetProp WB -LALL -aALL + +Set Write Policy to WriteBack on Adapter 0, VD 0 (target id: 0) success +Set Write Policy to WriteBack on Adapter 0, VD 1 (target id: 1) success + +Exit Code: 0x00 +~~~ + +Et dans le cas ou la batterie subisse une defaillance, on demande à ce que le cache soit désactivé : +~~~ +# /opt/MegaCli -LDSetProp NoCachedBadBBU -LALL -aALL + +Set No Write Cache if bad BBU on Adapter 0, VD 0 (target id: 0) success +Set No Write Cache if bad BBU on Adapter 0, VD 1 (target id: 1) success + +Exit Code: 0x00 +~~~ + +Les débits en lecture/écriture devraient faire un bond ! + +## Ajout d'un nouveau volume RAID + +Exemple avec l'ajout d'un volume RAID1 sur 2 nouveaux disques : + +~~~ +# /opt/MegaCli -CfgLdAdd -r1 [32:2,32:3] -a0 + +Adapter 0: Created VD 1 + +Adapter 0: Configured the Adapter!! + +Exit Code: 0x00 +~~~ + +Ou un disque simple : + +~~~ +# /opt/MegaCli -CfgLdAdd -r0 [252:3] -a0 + +Adapter 0: Created VD 2 + +Adapter 0: Configured the Adapter!! + +Exit Code: 0x00 +~~~ + +## Sauvegarde/restauration de la configuration + +~~~ +# megacli -CfgSave -f /home/backup/megacli_conf.dump -a0 + +# megacli -CfgRestore -f /home/backup/megacli_conf.dump -a0 +~~~ \ No newline at end of file diff --git a/ServeurDedibox.md b/ServeurDedibox.md new file mode 100644 index 00000000..5e910706 --- /dev/null +++ b/ServeurDedibox.md @@ -0,0 +1,340 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Serveur Dedibox + +Interventions Online : + +## Installation + +À installer sous Debian évidemment ;-) + +Bien avoir en tête que l'outil de partitionnement en ligne de Dédibox est nul : dès qu'il y a un partitionnement +digne de ce nom, cela échoue. Il faut donc faire un partitionnement léger avec seulement 3 partitions +primaires et repasser en mode "secours" et finir le partitionnement à la main. + +Autre particularité, il semble conseillé d'installé un noyau backporté (2.6.39). +Voici ce que l'on nous a dit sur l'IRC #online : + +~~~ +15:29 <@philou> reg_: en debian 6 fait mettre kernel 2.6.39 si ca down trop souvent l'ipmi ou prob + reseau. kernel d'avant son pas top pour la gestion carte resau +[...] +15:34 <@philou> reg_: si tu as pas de prob reste en .32 +15:35 <@philou> reg_: mais au cas ou +~~~ + +Les infos d'Online pour le noyau : + + + +### Installation via KVM iLO + + + +## IPv4 + +Les nouvelles machines sont configurés en DHCP. On pourra sans problème désactiver le DHCP et passer en mode statique. + +## IPv6 + +L'IPv6 n'est pas activé par défaut en auto-configuration (pas de RA) et il faut demander un « bloc IPv6 » dans la console Online. +Si vous avez un bloc IPv6 qui commence par 2a01, il faut d'abord le résilier dans « Mon compte ». Puis commander un nouveau bloc IPv6 qui commence par 2001. + +Il y a un bloc par client, mais il est possible de créer 1 sous-réseau par machine. + +/etc/network/interfaces + +~~~ +iface eth0 inet6 static + address 2001:0e0b:2368:100::115 #exemple + netmask 56 + pre-up dhclient -cf /etc/dhcp/dhclient6.conf -6 -P eth0 + pre-down dhclient -x -pf /var/run/dhclient6.pid +~~~ + +Dans /etc/dhcp/dhclient6.conf, mettre le DUID fourni dans la console Online. + +~~~ +interface "eth0" { + send dhcp6.client-id DUID; + request; +} +~~~ + +Autoriser le trafic DHCPv6 dans minifirewall + +~~~ +#dhclient6 - obligatoire chez online +/sbin/ip6tables -t filter -A INPUT -i $INT -p udp --dport 546 -d fe80::/64 -j ACCEPT +/sbin/ip6tables -t filter -A OUTPUT -o $INT -p udp --dport 547 -j ACCEPT +~~~ + +S'assurer qu'il n'y a pas d'autoconf sur l'infterface eth0 : + +~~~ +# sysctl -w net.ipv6.conf.eth0.autoconf=0 +# echo "net.ipv6.conf.eth0.autoconf=0" >> /etc/sysctl.conf +~~~ + +Puis relancer le réseau : + +~~~ +ifdown eth0 && ifup eth0 +~~~ + +## IP FailOver + +Online propose l'utilisation d'adresses IP supplémentaires sur un serveur et potentiellement "transportables" sur un autre serveur, d'où leur nom IP FailOver. + +Pour en ajouter une, il faut le gérer via la Console Online, puis on ajoute une configuration de ce type sous Debian (attention, le masque est bien un /32 !!) : + +~~~ +auto eth0:0 +iface eth0:0 inet static + address 192.0.43.2 + netmask 255.255.255.255 +~~~ + +## Ajout de disques + +*Attention ! * + +Si vous commandez des nouveaux disques, la création d'un nouvel array doit se faire en vKVM. La console Online nécessite de reset tout les volumes RAID… ! + + +~~~ +Cela doit être fait manuellement depuis votre KVM et sur le BIOS. Lancer cette opération depuis votre console entraînerait un formatage complet de vos données sur l'Array 1. +~~~ + + +## Gestion de la carte RAID + +Les serveurs Dedibox Pro sont équipés d'une carte RAID "DELL H200", qui utilise le chipset SAS2008 de LSI Logic. +Le module noyau pour son support se nomme "mtp2sas". + +Un lspci donne : +~~~ +[...] +03:00.0 Serial Attached SCSI controller: LSI Logic / Symbios Logic SAS2008 PCI-Express Fusion-MPT SAS-2 [Falcon] (rev 03) +[...] +~~~ + +### Récupération de l'utilitaire + +La version la plus récente de l'utilitaire sas2ircu se trouve (étrangement) chez IBM : [[BR]] +Le binaire fonctionne indifféremment en 32 ou 64 bits. + +### Interrogation de la carte RAID + +Lancer sas2ircu sans argument(s) affiche la liste des options : +~~~ +LSI Corporation SAS2 IR Configuration Utility. +Version 4.00.00.00 (2009.10.12) +Copyright (c) 2009 LSI Corporation. All rights reserved. + +SAS2IRCU: No command specified. + sas2ircu ... + where is: + Number between 0 and 255 + where is: + DISPLAY - display controller, volume and physical device info + LIST - Lists all available LSI adapters (does not need ctlr #> + CREATE - create an IR volume + DELETE - set controller configuration to factory defaults + HOTSPARE - make drive a hot spare + STATUS - display current volume status info + CONSTCHK - Start Consistency Check operation on the specified IR Volume + ACTIVATE - Activate an Inactive IR volume + LOCATE - Locate a disk drive on an enclosure + LOGIR - Upload or Clear IR Log data + BOOTIR - Select an IR Boot Volume as primary boot device + BOOTENCL - Select an Enclosure/Bay as primary boot device + where are: + Command specific values; enter "sas2ircu " + to get command specific help + +~~~ + +Pour afficher l'état du premier volume RAID : +~~~ +# ./sas2ircu 0 DISPLAY +~~~ +~~~ +LSI Corporation SAS2 IR Configuration Utility. +Version 4.00.00.00 (2009.10.12) +Copyright (c) 2009 LSI Corporation. All rights reserved. + +Read configuration has been initiated for controller 0 +------------------------------------------------------------------------ +Controller information +------------------------------------------------------------------------ + Controller type : SAS2008 + BIOS version : 7.01.09.00 + Firmware version : 2.15.63.00 + Channel description : 1 Serial Attached SCSI + Initiator ID : 0 + Maximum physical devices : 39 + Concurrent commands supported : 3439 + Slot : 1 + Segment : 0 + Bus : 3 + Device : 0 + Function : 0 + RAID Support : Yes +------------------------------------------------------------------------ +IR Volume information +------------------------------------------------------------------------ +IR volume 1 + Volume ID : 79 + Status of volume : Okay (OKY) + RAID level : RAID1 + Size (in MB) : 1907200 + Physical hard disks : + PHY[0] Enclosure#/Slot# : 1:0 + PHY[1] Enclosure#/Slot# : 1:1 +------------------------------------------------------------------------ +Physical device information +------------------------------------------------------------------------ +Initiator at ID #0 + +Device is a Hard disk + Enclosure # : 1 + Slot # : 0 + State : Optimal (OPT) + Size (in MB)/(in sectors) : 1907729/3907029167 + Manufacturer : SEAGATE + Model Number : ST32000444SS + Firmware Revision : KS68 + Serial No : 9WM3AX59 + Protocol : SAS + Drive Type : SAS_HDD + +Device is a Hard disk + Enclosure # : 1 + Slot # : 1 + State : Optimal (OPT) + Size (in MB)/(in sectors) : 1907729/3907029167 + Manufacturer : SEAGATE + Model Number : ST32000444SS + Firmware Revision : KS68 + Serial No : 9WM3AT71 + Protocol : SAS + Drive Type : SAS_HDD + +Device is a Enclosure services device + Enclosure # : 1 + Slot # : 8 + State : Standby (SBY) + Manufacturer : DP + Model Number : BACKPLANE + Firmware Revision : 1.07 + Serial No : 0BL00BH + Protocol : SAS + Drive Type : SAS_HDD +------------------------------------------------------------------------ +Enclosure information +------------------------------------------------------------------------ + Enclosure# : 1 + Logical ID : 5782bcb0:09870a00 + Numslots : 9 + StartSlot : 0 + Primary Boot Slot : 0 +------------------------------------------------------------------------ +SAS2IRCU: Command DISPLAY Completed Successfully. +SAS2IRCU: Utility Completed Successfully. + +~~~ + +### Monitoring du RAID + +On peut ainsi écrire un petit script qui pourra être placé en cron pour avertir en cas de défaillance d'un disque ou du contrôleur : + +~~~ +#!/bin/sh + +# CONFIGURATION +BINARY=/opt/sas2ircu +TMPFILE=/var/tmp/raid-status +MAIL=admin@example.com +HOST=`hostname` + +NBVOL=1 +NBDISKS=2 + +# TESTING BINARY +if [ ! -e ${BINARY} ]; then + echo "Check RAID impossible" | mail -s "[warn] Probleme RAID sur ${HOST}" ${MAIL} + exit 3 +fi + +# TESTING RAID STATE +${BINARY} 0 DISPLAY > ${TMPFILE} +STATE=$? + +NBVOLOK=$(grep 'Okay (OKY)' ${TMPFILE} | wc -l) +NBDISKSOK=$(grep 'Optimal (OPT)' ${TMPFILE} | wc -l) + +if [ $NBVOLOK -eq $NBVOL ] && [ $NBDISKSOK -eq $NBDISKS ]; then + exit 0 +else + cat ${TMPFILE} | mail -s "[warn] Probleme RAID sur ${HOST}" ${MAIL} + exit 2 +fi +~~~ + +Il est aussi possible d'utiliser ce script avec Nagios, ses codes de sortie correspondent aux niveaux d'erreur : + +* Exit code 3 - UNKNOWN : lorsque le binaire "sas2ircu" est absent +* Exit code 2 - CRITICAL : lorsqu'un disque/contrôleur est en erreur +* Exit code 0 - OK : lorsqu'on peut dormir sur nos deux oreilles + +## Backup avec RPN Rsync + +Documentation Online : +[]=rsync (Notamment procédure pour commander un espace de stockage). + +Note, bien que conseillé par Online, l'utilisation du DHCP n'est pas obligatoire. Il suffit de lancer une fois un dhclient pour récupérer l'adressage et on pourra le positionner en dur dans /etc/network/interfaces pour éviter de faire tourner un client DHCP. + +Avec cet espace de stockage on pourra faire des sauvegardes incrémentielles avec rsync en utilisant les hardlinks. + +Exemple en CLI. + +Synchro : + +~~~ +# RSYNC_PASSWORD=XXX rsync -av --delete --link-dest=/current/ /etc/ rsync://evolix-xxx@evolix-xxx.backup.rpn-rsync.online.net/evolix-xxx_backup/2014-03-17 +# RSYNC_PASSWORD=XXX rsync -av --delete --link-dest=/current/ /etc/ rsync://evolix-xxx@evolix-xxx.backup.rpn-rsync.online.net/evolix-xxx_backup/2014-03-18 +~~~ + +Effacement vieux backups : + +~~~ +# mkdir /tmp/empty +# RSYNC_PASSWORD=XXX rsync -av --delete /tmp/empty/ rsync://evolix-xxx@evolix-xxx.backup.rpn-rsync.online.net/evolix-xxx_backup/2014-03-17 +~~~ + +Lister le contenu, pour par exemple chercher ce qu'on peut restaurer : + +~~~ +# RSYNC_PASSWORD=XXX rsync --list-only rsync://evolix-xxx@evolix-xxx.backup.rpn-rsync.online.net/evolix-xxx_backup/ +~~~ + +Ou via evobackup-linkdest : + +## Migration adresses IP + +Online a modifié son réseau en 2014 en utilisant des nouvelles adresses IP (IPv4 et IPv6) afin d'avoir un routage indépendant d'Iliad Entreprises. +En conséquence, toutes les anciennes Dedibox ont du migrer vers un nouvel adressage avant septembre 2014. + + + +### Procédure + + + +1/ Pré-migration : ajouter la nouvelle adresse IP en alias dans /etc/network/interfaces et cliquer sur "Pré-migrer" + +2/ Migration finale : inverser l'ancienne et la nouvelle adresse IP (l'ancienne adresse IP devient un alias) : la gateway est donc modifiée ! [[BR]] +Il faut cliquer sur "Migrer" puis envoyer au moins un paquet DHCP : via dhclient (dhclient -d eth0 + Ctrl+C ou reboot car il y a un boot PXE chez Online)[[BR]] +Il faut bien sûr penser aux différents détails : firewall, application, DNS / reverse DNS, etc. qu'implique un changement d'adresse IP. + diff --git a/ServeurGANDI.md b/ServeurGANDI.md new file mode 100644 index 00000000..a68b0536 --- /dev/null +++ b/ServeurGANDI.md @@ -0,0 +1,225 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto GANDI Hosting + +Les serveurs proposés par GANDI Hosting sont des machines virtuelles Xen. +Ils permettent notamment l'ajout/suppression de mémoire et core CPU à chaud. + +## Spécificités Gandi + +Gandi installe une clé publique dans _/root/.ssh/authorized_keys_ : + +~~~ +from="217.70.181.*" ssh-dss AAAAB3NzaC1kc3MAAACBAK9NzNMvvimq4+k3wf0cQDfiDDNpdtbOo/IpjKzI7MRwvvIuwdEKZ7Xp7J/sJM3uMuSK1vGpJXkJ3bxFL5e0Wk/GJBP7STFMqPVZZrMfL/uep9DT +/HssOYwtvZheP39PT29NMqXEmwUBrW2yojeol9BNCzxvX0D2oh+fMUmDfKxfAAAAFQC8ylRZUIdLgxGMlP4KRRX1rhd0mQAAAIBohLoFIe2zzWglQMobuKSqfhkTDA3KubgAUzkrA5aGZsPeiSChXOF97ilyKocH +PBDTLbMTyyu27JFAFKiLNB021RQOMtWtsDp6vGi3OQiys+MIUH1AcAid1Q7LijCIcSUQy/yaioOryNa0k7St10IRA3W/q/OyeGgiPz/BdoAdUwAAAIBDBij4WU5EcqjcW+JLuYPJ1Al3EkrA4SNktNNFtdTmfd0h +NKycQ8/wN+sNeLIx9uB4q7OQRLbKpNSW/mODA8japElhSySNWwUi35M+W2/9RbTTvzhD/NRrAmMFpLJd7gT26ITgjQ7G9fYi8VrvxT8092kWntQea9GikDNjKQvsHQ== mgt_gandi +~~~ + +Cela leur permet de prendre la main en _root_ en cas de nécessité. Attention, pour interdire cela par défaut tout (en gardant la possibilité de l'activer), +on a tendance à positionner _PermitRootLogin no_ dans la configuration du serveur SSH... sauf que Gandi force (au boot notamment) _PermitRootLogin without-password_ !!! +À savoir... + +Gandi installe cinq paquets spécifiques. À part un, on peut les désinstaller car ils servent uniquement à l'installation du système : + +~~~ +# aptitude purge gandi-hosting-agent gandi-hosting-agent-plugins-internal-debian gandi-hosting-agent-plugins-internal-unix gandi-hosting-agent-schemes +~~~ + +Note : il faut lancer la commande deux fois à cause d'un conflit lors de la suppression du paquet _gandi-hosting-agent-plugins-internal-unix_ + +Source : + +Le paquet _gandi-hosting-vm_ permet d'automatiser certaines actions demandées à partir du panel Gandi, comme le montage automatiques des disques +attachés au serveur ou l'ajout d'adresses IP supplémentaires. +Pour bénéficier des mises-à-jour de ce paquet, on gardera le dépôt _ comme indiqué plus haut. + +## Mise-à-jour du noyau + +Il suffit d'aller sur le panel Gandi dans les options avancées de son "disque système" et de choisir la version souhaitée. + +Il faut également installer les nouveaux modules via la procédure décrite sur +On pourra lister exhaustivement les modules disponibles via la commande suivante exécutée sur le serveur : + +~~~ +$ GET | grep modules | sed 's/^.*a href="\(.*\)".*/\1/' +~~~ + +Attention, pour les noyaux >= 2.6.32 il faut activer la sortie standard sur *hvc0* (options avancées du panel Gandi) +et s'assurer d'avoir dans la ligne suivante dans le fichier _/etc/inittab_ du serveur : + +~~~ +1:2345:respawn:/sbin/getty 38400 hvc0 +~~~ + +Ceci est indispensable pour avoir un mode console utilisable ! + +Note : il y a parfois des bugs avec les scripts Gandi, notamment dans le montage auto des différents disques : + ils se montent parfois en tant que /srv/NOM.2 et il est nécessaire de nettoyer /srv/NOM... + + +## Reboot en cas de faille de sécurité sur le noyau + +GANDI prévient et il suffit de stop puis start sa VM via l'interface web. + +Voir + +## Accès console de secours + +Pour cela il faut l'activer dans l'interface d'admin, puis l'on pourra avoir un accès console via : + +~~~ +$ ssh @console.gandi.net +~~~ + +## IPv6 + +Depuis début janvier 2011, GANDI active désormais l'IPv6 par défaut : + +Pour le désactiver, l'une des méthodes est de lancer ces commandes : + +~~~ +# sysctl -w net.ipv6.conf.all.autoconf=0 +# sysctl -w net.ipv6.conf.all.disable_ipv6=1 +# ifconfig eth0 del 2001:4b98:..../64 +~~~ + +Pour que cela reste en place, on ajoutera dans le fichier */etc/sysctl.conf* : +~~~ +net.ipv6.conf.all.autoconf = 0 +net.ipv6.conf.all.disable_ipv6 = 1 +~~~ + +Pour l'utiliser sous contrôle, on utilisera des règles _ip6tables_. Cela nécessite d'avoir un noyau Linux >= 2.6.32 (voir plus haut) et d'ajuster ces régles. +Pour ne rien laisser par défaut : + +~~~ +# /sbin/ip6tables -P INPUT DROP +# /sbin/ip6tables -P OUTPUT DROP +# /sbin/ip6tables -P FORWARD DROP +~~~ + +## Gestion des disques + +### Augmenter la taille d'un volume de données attaché + + + +#### Volume non système + +- Cliquer sur augmenter dans l'interface (cela ne reboot pas la VM) + +- Une fois l'opération terminée, faire à chaud (sans démontage de la partition) : + +~~~ +xvdg: detected capacity change from 5368709120 to 10737418240 + +# resize2fs /dev/xvdg +[...] +VFS: busy inodes on changed media or resized disk xvdg +~~~ + +ATTENTION : une fois cette opération réalisée, la nouvelle taille sera bien remontée par le système (df) +MAIS il sera tout de même nécessaire de redémarrer pour ne pas se heurter à des "Aucun espace disponible sur le périphérique" + + +#### Volume non système (DEPRECATED) + +Pour les nouveaux volumes (depuis 2011), il suffit de lancer un redimensionnement à chaud de la partition. + +Pour les anciens volumes, suivre la procédure suivante : + +1. Modifier la taille du volume... mais ATTENTION, CELA PROVOQUE LE REDÉMARRAGE IMMÉDIAT DE LA MACHINE VIRTUELLE !! + +2. Redimensionner votre système de fichiers à froid : + +~~~ +# umount /srv/foodata && e2fsck -f /dev/xvdb -C0 +e2fsck 1.41.3 (12-Oct-2008) +Passe 1 : vérification des i-noeuds, des blocs et des tailles +Passe 2 : vérification de la structure des répertoires +Passe 3 : vérification de la connectivité des répertoires +Passe 4 : vérification des compteurs de référence +Passe 5 : vérification de l'information du sommaire de groupe +foodata : 12/327680 fichiers (0.0% non contigus), 55935/1310720 blocs +# umount /srv/foodata && resize2fs /dev/xvdb +resize2fs 1.41.3 (12-Oct-2008) +Resizing the filesystem on /dev/xvdb to 2621440 (4k) blocks. +Le système de fichiers /dev/xvdb a maintenant une taille de 2621440 blocs. +# mount /dev/xvdb /srv/foodata +~~~ + +Note : il est important de (re)démonter avant chaque opération, car les volumes peuvent se monter "tout seul" (merci GANDI...) + +### Volume système (DEPRECATED??) + +Cette opération est dangereuse ! Elle consiste notamment à changer la table de partitions à chaud. +Voir les étapes détaillées sur + +Attention, lors du repartitionnement, on préfera utiliser le mode "cylindre" afin d'éviter un message du type "Partition 1 does not end on cylinder". + +### Migrer des volumes d'un serveur vers la nouvelle infra de stockage + +Pour diverses raisons (meilleure gestion, support des snapshots, etc.) il est conseillé de migrer vos disques vers la nouvelle infra de stockage Gandi. + +Pour cela vous devrez : + +* éteindre votre serveur, +* copier tous vos volumes associés à votre serveur (ils passeront donc avec la nouvelle infra), +* détacher les anciens volumes de votre serveur +* rattacher tous les volumes copiés à votre serveur +* marquer le nouveau volume système comme "bootable" +* redémarrer votre serveur + +Note 1 : pensez bien à marquer votre volume "système" comme bootable + +Note 2 : pensez à supprimer vos anciens volumes peu de temps après car vous les payez ;-) + +### Créer un serveur de test à partir de snapshots de volumes + +On peut désormais créer des snaphots de volume, on peut donc s'en servir pour créer à chaud un serveur "snapshot". + +Pour cela vous devrez : + +* créer des snapshots de chaque volume associé à votre serveur +* créer des volumes à partir de chaque snapshot créé +* créer un nouveau serveur avec un système quelconque +* éteindre ce nouveau serveur , puis détacher/supprimer le volume système de ce nouveau serveur +* attacher les volumes créés à partir des snapshots à ce nouveau serveur +* marquer le nouveau volume système comme "bootable" +* démarrer ce nouveau serveur + +Note 1 : il pourra être utile d'éteindre les démons "cron" ou Postfix (SMTP) si vous copiez un serveur de production + +Note 2 : pensez à supprimer vos anciens volumes peu de temps après car vous les payez ;-) + +## Ajouter une adresse IP sur un serveur + +*WARNING : on déconseille finalement l'ajout d'une 2ème adresse IP, cela fonctionne très mal => l'IP se déactive en permanence, il faut relancement manuellement un _sysctl -p /etc/sysctl.conf_...* + +On peut ajouter une "interface" sur un serveur, elle s'ajoute automatiquement sur le serveur. +Mais la particuliarité est qu'une route par défaut est ajoutée pour chaque interface ! +On doit donc gérer des paramètres dans le noyau Linux, Notamment désactiver +_rp_filter_ et _arp_filter_ pour toutes les interfaces, et gérer _arp_announce_. + +Voici par exemple le fichier _sysctl.conf_ pour 2 interfaces réseau : + +~~~ +net.ipv4.conf.all.arp_announce = 2 +net.ipv4.conf.default.arp_announce = 0 +net.ipv4.conf.lo.arp_announce = 0 + +net.ipv4.conf.eth1.arp_announce = 0 + +net.pv4.conf.all.arp_filter = 0 +net.ipv4.conf.all.rp_filter = 0 +net.ipv4.conf.default.rp_filter = 0 +net.ipv4.conf.default.arp_filter = 0 + +net.ipv4.conf.eth0.rp_filter = 0 +net.ipv4.conf.eth0.arp_filter = 0 +net.ipv4.conf.eth1.rp_filter = 0 +net.ipv4.conf.eth1.arp_filter = 0 +~~~ + +Note : il est conseillé de mettre au moins 1 Mb/s (ou + ??) pour chaque interface. diff --git a/ServeurGoogleCloud.md b/ServeurGoogleCloud.md new file mode 100644 index 00000000..fb4d995f --- /dev/null +++ b/ServeurGoogleCloud.md @@ -0,0 +1,87 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Google Cloud + +## Infos Cloud Engine + +- Présence de zones aux USA, Europe et Asie. L’Europe est à 50ms d'une Freebox.[[BR]] +- Ajouter alias IPv4 --> *Cela ne semble pas possible*. 1 seule adresse IP publique par machine. Le compte démo « free trial » est limité à 1 adresse IP cela dit… Peut-être en mode payant, on peut.[[BR]] +- Quid de l'IPv6 --> *IPvQuoi ? Le néant*.[[BR]] +- Gestion des volumes / disques --> Choix de SSD local à l'hyperviseur (Forcé à 375G, Max 8 vols, Peut être crée que lors de la création de la VM *Empêche la migration/déplacement de VM*), SSD (Max 65T), HDD (Max 65T). (Tous en persistant).[[BR]] +- Perfs disques[[BR]] + +~~~ + Iops annoncés[[BR]] +- Local SSD : 100 000 lecture / 70 000 écriture[[BR]] +- SSD : 3 000 / 3000 (BP 48Mo/s)[[BR]] +- HDD : 150 / 750 (BP 60/45Mo/s)[[BR]] + +Local SSD : +time dd if=/dev/zero bs=4096 count=4194304 2>/tmp/out | pv > 16G ; cat /tmp/out +17179869184 bytes (17 GB) copied, 39.8078 s, 432 MB/s + +SSD : +time dd if=/dev/zero bs=4096 count=4194304 2>/tmp/out | pv > 16G ; cat /tmp/out +17179869184 bytes (17 GB) copied, 620.13 s, 27.7 MB/s +Note : Saturation à 100% du disque, gros ralentissement de la machine, lors du @dd@ de bench. + +HDD : +time dd if=/dev/zero bs=4096 count=4194304 2>/tmp/out | pv > 16G ; cat /tmp/out +17179869184 bytes (17 GB) copied, 219.622 s, 78.2 MB/s + +Conclusion : +Plus rapide en BP, SSD Local, HDD et SSD. +Plus rapide en iops, SSD Local, SSD, et HDD. (Théorie, non testé). +~~~ + +*Bon à savoir que le SSD est plus lent en bande passante que le HDD ! *[[BR]] +*Impossible de détacher le disque rootfs d'une machine. Impossible de faire du rescue et monter le disque sur une autre machine.* [[BR]] +Un snapshot ne permet pas de remonter la machine à la date du snapshot, c'est juste une copie du disque (pour faire des backups à froid ou autre utilisation). + +- Snapshots --> Gestion classique.[[BR]] +- Iperf --> *UDP limité à 1Mbps*, TCP 1Gbps[[BR]] + +~~~ +root@evolinux:~# iperf -u -c ping.online.net +------------------------------------------------------------ +Client connecting to ping.online.net, UDP port 5001 +Sending 1470 byte datagrams +UDP buffer size: 208 KByte (default) +------------------------------------------------------------ +[ 3] local 10.132.0.2 port 54641 connected with 62.210.18.40 port 5001 +[ ID] Interval Transfer Bandwidth +[ 3] 0.0-10.0 sec 1.25 MBytes 1.05 Mbits/sec +[ 3] Sent 893 datagrams +[ 3] Server Report: +[ 3] 0.0-10.0 sec 1.25 MBytes 1.05 Mbits/sec 0.036 ms 0/ 893 (0%) +~~~ +~~~ +root@evolinux:~# iperf -t60 -c ping.online.net +------------------------------------------------------------ +Client connecting to ping.online.net, TCP port 5001 +TCP window size: 85.0 KByte (default) +------------------------------------------------------------ +[ 3] local 10.132.0.2 port 40783 connected with 62.210.18.40 port 5001 +[ ID] Interval Transfer Bandwidth +[ 3] 0.0-60.0 sec 7.03 GBytes 1.01 Gbits/sec +~~~ + +- Gestion du firewalling --> Gestion classique, dans le sens Internet --> VM seulement.[[BR]] + +### Scripts Google + +Des scripts (Python et Shell) spécifique à Google sont installés sur les VM, dans /usr/share/google/, et des scripts d'init dans /etc/init.d/ et /etc/rc.local. + +Deux démons en Python tournent en permanence : + +* /usr/share/google/google_daemon/manage_accounts.py +* /usr/share/google/google_daemon/manage_addresses.py + +Le premier s'assure que la liste des comptes Unix et leur clé SSH autorisée (~/.ssh/authorized_keys) sont bien présents sur le système, en comparant avec ceux déclarés dans l'interface web, et les recrée si besoin. +Le second gère les adresses IPv4 supplémentaires en gérant les fichiers dans /etc/network/interfaces.d/. + +Les 2 scripts font appel à une API accessible en interne sur metadata.google.internal. + +### Port SMTP bloqué + +Le port réseau SMTP est bloqué en sortie sans possibilité de désactiver le blocage ! Il faut soit passer par un relai SMTP externe accessible sur un autre port, soit utilisé un service d'envoi autorisé par Google. diff --git a/ServeurHP.md b/ServeurHP.md new file mode 100644 index 00000000..e44f8511 --- /dev/null +++ b/ServeurHP.md @@ -0,0 +1,31 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Serveur HP Proliant + +## Mises-à-jour BIOS et firmwares + +Télécharger et graver le DVD Service Pack for Proliant (HPP) via www.hp.com/go/spp +(attention, il faut un compte HP, c'est fastidieux...) + +Démarrer sur le DVD et l'on peut choisir de flasher manuellement ou tous les firmwares du serveur (attention, c'est long ~30 minutes) + +## Logs "Active Health System" + +Pour récupérer les logs "Active Health System" (parfois demandé par le support HP), +*prévoir une clé USB formatée en FAT32*, puis faire : + +Démarrer via F10 (cela boote sur un Linux !) + +Brancher la clé USB + +Choisir "HP System Log Reader Utility" + +On arrive sur un écran où l'on peut copier les logs sur la clé USB : + +[[Image(intervention-HP-nov2015-ActiveHealthSystemLog.jpg)]] + + +## ILO + +Par défaut l'interface ILO est en DHCP, pour y accéder il suffit de taper son adresse IP via un navigateur web. +Le login par défaut est « Administrator », est le mot de passe est indiqué sur une étiquette collée sur le serveur. \ No newline at end of file diff --git a/ServeurHP/RAID.md b/ServeurHP/RAID.md new file mode 100644 index 00000000..c6082ed1 --- /dev/null +++ b/ServeurHP/RAID.md @@ -0,0 +1,89 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Accéder au BIOS + +Appuyer sur F8 au bon moment : + +# Installer l'utilitaire + +Tout d'abord, en 64bits, installer les librairies de compatibilité 32bits : +~~~ +root@~> aptitude install ia32-libs +~~~ + +Une fois fait, on va télécharger leur utilitaire. Dans le code source de [page](http://h20000.www2.hp.com/bizsupport/TechSupport/SoftwareDescription.jsp?lang=en&cc=us&prodTypeId=15351&prodSeriesId=1121486&swItem=MTX-799829d8271f455d9367978b5a&prodNameId=3288144&swEnvOID=4033&swLang=8&taskId=135&mode=4&idx=1|cette) trouvez le chemin exact pour le récupérer avec _wget_ (au moment où je rédige ces lignes, le chemin est ftp://ftp.hp.com/pub/softlib2/software1/pubsw-linux/p1976866454/v55141/HP_ProLiant_Value_Add_Software-8.25-19-12.iso). + +Téléchargez l'ISO sur le serveur : +~~~ +root@~> wget ftp://ftp.hp.com/pub/softlib2/software1/pubsw-linux/p1976866454/v55141/HP_ProLiant_Value_Add_Software-8.25-19-12.iso +~~~ + +Ensuite, monter l'ISO pour récupérer le paquet et l'installer (adapter à la version et l'architecture) : +~~~ +root@~> mkdir hp_cd +root@~> mount -o loop HP_ProLiant_Value_Add_Software-8.25-19-12.iso hp_cd +root@~> cp hp_cd/pool/non-free/hpacucli_8.28-13.0.10-9_amd64.deb /tmp +root@~> cd /tmp +root@/tmp/> dpkg -i hpacucli_8.28-13.0.10-9_amd64.deb +~~~ + +Voilà, l'utilitaire est installé ! + + +# Récupérer les informations des disques + +Pour récupérer les informations sur le tableau RAID, on commence d'abord par connaître le n° de tableau dans lequel se trouve notre disque +~~~ +root@~> hpacucli +=> ctrl all show config +Smart Array P400i in Slot 0 (Embedded) (sn: PH78MV8884 ) + + array A (SAS, Unused Space: 0 MB) + + logicaldrive 1 (136.7 GB, RAID 1, Interim Recovery Mode) + + physicaldrive 1I:1:1 (port 1I:box 1:bay 1, SAS, 146 GB, OK) + physicaldrive 1I:1:2 (port 1I:box 1:bay 2, SAS, 146 GB, Failed) +~~~ + +On voit bien le tabeau RAID avec l'ID 0, et deux disques physiques qui composent notre disque logique, dont l'un des deux est noté *Failed* + +Ensuite, pour trouver le n° de série du disque, on prend sont ID de disque physique (1I:1:2) et on demande ses informations dans le tabeau RAID 0 +~~~ +=> controller slot=0 physicaldrive 1I:1:2 show + +Smart Array P400i in Slot 0 (Embedded) + + array A (Failed) + + physicaldrive 1I:1:2 + Port: 1I + Box: 1 + Bay: 2 + Status: Failed + Drive Type: Data Drive + Interface Type: SAS + Size: 146 GB + Rotational Speed: 10000 + Firmware Revision: HPD5 + Serial Number: 3NM27MPQ00009750M7C4 + Model: HP DG146ABAB4 + PHY Count: 1 + PHY Transfer Rate: 3.0GBPS +~~~ + +Pour avoir plus de détails : + +~~~ +=> ctrl all show config detail + +Smart Array P410i in Slot 0 (Embedded) + Bus Interface: PCI + Slot: 0 +[...] +~~~ + + +# Mettre à jour le firmware + +Récupérer le firmware sur le support HP, il s'agit d'un script BASH auto-extractible. Executez-le et suivez les instructions. \ No newline at end of file diff --git a/ServeurHyperV.md b/ServeurHyperV.md new file mode 100644 index 00000000..ea5338c1 --- /dev/null +++ b/ServeurHyperV.md @@ -0,0 +1,9 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + + +## Installation d'une Debian dans une VM Hyper-V + +#### Carte réseau non détectée + +Si Debian ne détecte pas la carte réseau lors de l'installation, c'est que la VM n'a pas été configuré avec la bonne carte. Lors de l'ajout d'une interface réseau, il faut bien sélectionner _Legacy Network Adapter_. +Voir ici pour la procédure en image : (§ Configure Networking) \ No newline at end of file diff --git a/ServeurIBM.md b/ServeurIBM.md new file mode 100644 index 00000000..121443c2 --- /dev/null +++ b/ServeurIBM.md @@ -0,0 +1,67 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +Choses à respecter pour éviter les problèmes + + +## Ajout de mémoire RAM + +Les barrettes de RAM se positionne suivant un ordre précis et non linéaire. Il est indiqué au dos du couvercle du boitiers. + +Si l'ordre n'est pas respecté, certaines barrettes peuvent ne pas être détectées. + +## Accès au BIOS des périphériques + +Pour accéder au firmware des périphériques branchés sur le serveur il faut d'abord passer par le BIOS. +Puis aller dans System Settings ? Adapters and UEFI drivers ? Please refresh this page on the first visit qui affichera la liste des périphériques et permettra de les configurer. + +## Mise à jour du BIOS + +On ira sur le site d'[IBM](http://www.ibm.com/support/) en rentrant le modèle de la machine (affiché sur une étiquette ou dans le BIOS). + +L'outil pour flasher le BIOS est s'exécute à chaud sur GNU/Linux, c'est un script shell. + +Exemple d'utilisation : + +~~~ +./ibm_fw_bios_gfe149b-1.17_linux_i386.sh -s +~~~ + +Il se peut que ça « bug », comme c'est une archive auto-extractible, on l'extrait et on lance lfash à la main. + + +~~~ +./ibm_fw_bios_gfe149b-1.17_linux_i386.sh -x /tmp +cd /tmp/linwrap +./lflash64 +~~~ + + + +## Configuraton du BIOS + +Options recommandées : + +[[Image(0.jpg)]] + +[[Image(1.jpg)]] + +[[Image(2.jpg)]] + +[[Image(3.jpg)]] + +[[Image(4.jpg)]] + +[[Image(5.jpg)]] + +[[Image(6.jpg)]] + +[[Image(7.jpg)]] + +[[Image(8.jpg)]] + +[[Image(9.jpg)]] + +[[Image(10.jpg)]] + +[[Image(11.jpg)]] + diff --git a/ServeurIBM/RAID.md b/ServeurIBM/RAID.md new file mode 100644 index 00000000..3c6a3f38 --- /dev/null +++ b/ServeurIBM/RAID.md @@ -0,0 +1,42 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +Lors de l'installation de Debian, il se peut que la carte controleur RAID ne soit pas détectée correctement. + +## Carte controleur LSI Logic MegaRAID SAS 9240-8i + +Retour de lspic : +~~~ +10:00.0 RAID bus controller: LSI Logic / Symbios Logic Device 0073 (rev 02) + Subsystem: IBM Device 03b1 + Flags: bus master, fast devsel, latency 0, IRQ 24 + I/O ports at 2000 [size=256] + Memory at 97b40000 (64-bit, non-prefetchable) [size=16K] + Memory at 97b00000 (64-bit, non-prefetchable) [size=256K] + Expansion ROM at 98000000 [disabled] [size=256K] + Capabilities: [50] Power Management version 3 + Capabilities: [68] Express Endpoint, MSI 00 + Capabilities: [d0] Vital Product Data + Capabilities: [a8] Message Signalled Interrupts: Mask- 64bit+ Queue=0/0 Enable- + Capabilities: [c0] MSI-X: Enable- Mask- TabSize=15 + Capabilities: [100] Advanced Error Reporting + Capabilities: [138] Power Budgeting + Kernel driver in use: megaraid_sas +~~~ + +Il faut prendre la dernière version du module sur le [site de LSI](http://www.lsi.com/channel/products/megaraid/sassata/9240-8i/index.html?part_number=MegaRAID+SAS+9240-8i+KIT&x=11&y=9) et extraire le fichier megaraid_sas.ko, et le copier dans _/lib/modules/2.6.26-2-amd64/kernel/drivers/scsi/megaraid/_ + +Ensuite on peut charger le nouveau module : +~~~ +modprobe megaraid_sas +~~~ + +Enfin, une fois l'installation terminée, il faut à nouveau copier le module sur le système fraichement installé, puis regénérer l'image initrd en ajoutant le chargement de ce module : +~~~ +chroot /target /bin/bash +~~~ +~~~ +echo "megaraid_sas" >> /etc/initramfs-tools/modules +~~~ +~~~ +update-initramfs -u +~~~ diff --git a/ServeurOVH.md b/ServeurOVH.md new file mode 100644 index 00000000..47031ed8 --- /dev/null +++ b/ServeurOVH.md @@ -0,0 +1,202 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Serveur OVH + +Travaux OVH : + +Vue par datacenters/baies : + +Latence réseau OVH : + +## Noyau Linux pour serveurs OVH + +Pour installer un nouveau noyau compilé par OVH (par exemple un noyau sans l'option GRSEC), +il faut télécharger les fichiers *bzImage* et *System.map* sur ftp://ftp.ovh.net/made-in-ovh/bzImage/ + +Par exemple : + +~~~ +# cd /boot +# wget ftp://ftp.ovh.net/made-in-ovh/bzImage/3.10.18/bzImage-3.10.18-xxxx-grs-ipv6-64 +# wget ftp://ftp.ovh.net/made-in-ovh/bzImage/3.10.18/System.map-3.10.18-xxxx-grs-ipv6-64 +# wget ftp://ftp.ovh.net/made-in-ovh/bzImage/3.10.18/config-3.10.18-xxxx-grs-ipv6-64 +~~~ + +Il faut ensuite modifier la configuration du boot loader (GRUB ou LILO), voir ci-dessous : + +### Mettre un Boot Flag + +/!\ Il est important de mettre le « boot flag » avec `fdisk` ou équivalent sur la partition qui contient /boot /!\ + +### Pour GRUB + +Pour GRUB sous Squeeze : + +~~~ +# update-grub2 +Generating grub.cfg ... +Warning: update-grub_lib is deprecated, use grub-mkconfig_lib instead +Found linux image: /boot/bzImage-2.6.38.2-xxxx-std-ipv6-64 + No volume groups found +done +~~~ + +Note : attention, il va prendre par défaut le dernier noyau téléchargé, cf le fichier de configuration /etc/grub.d/06_OVHkernel + +### Pour LILO + +Modifier le fichier _lilo.conf_, par exemple ainsi : + +~~~ +lba32 +boot=/dev/md1 +raid-extra-boot=mbr-only +prompt +timeout=5 + +# Enable large memory mode. +large-memory + +image=/boot/bzImage-2.6.38.2-xxxx-grs-ipv6-64 + label="Linux" + root=/dev/md2 + read-only +~~~ + +Puis entrez la commande suivante : + +~~~ +# lilo +Added Linux * +The Master boot record of /dev/sda has been updated. +Warning: /dev/sdb is not on the first disk +The Master boot record of /dev/sdb has been updated. +One warning was issued. +~~~ + + +Voilà, une fois le boot loader modifié, vous pouvez redémarrer le serveur. + +## Vérifications du serveur + +Outre un reboot du serveur en mode _rescue_, voici certaines vérifications possibles. + +### Réseau + +~~~ +# ifconfig | grep error + RX packets:48653845 errors:0 dropped:0 overruns:0 frame:0 + TX packets:68256134 errors:0 dropped:0 overruns:0 carrier:0 + RX packets:13277345 errors:0 dropped:0 overruns:0 frame:0 + TX packets:13277345 errors:0 dropped:0 overruns:0 carrier:0 +~~~ + +### Disques / RAID + +~~~ +# tw_cli info C0 + +Unit UnitType Status %Cmpl Stripe Size(GB) Cache AVerify IgnECC +------------------------------------------------------------------------------ +u0 RAID-1 OK - - 698.637 ON - - + +Port Status Unit Size Blocks Serial +--------------------------------------------------------------- +p0 OK u0 698.63 GB 1465149168 5QD50X85 +p1 OK u0 698.63 GB 1465149168 5QD4N9L4 + +# smartctl -a -d 3ware,0 /dev/twe0 | egrep 'Serial|Error' +Serial Number: 5QD50X85 +Error logging capability: (0x01) Error logging supported. + 1 Raw_Read_Error_Rate 0x000f 113 100 006 Pre-fail Always - 0 + 7 Seek_Error_Rate 0x000f 084 060 030 Pre-fail Always - 260318814 +199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age Always - 0 +200 Multi_Zone_Error_Rate 0x0000 100 253 000 Old_age Offline - 0 +SMART Error Log Version: 1 +No Errors Logged +mediaaccess:~# smartctl -a -d 3ware,1 /dev/twe0 | egrep 'Serial|Error' +Serial Number: 5QD4N9L4 +Error logging capability: (0x01) Error logging supported. + 1 Raw_Read_Error_Rate 0x000f 104 100 006 Pre-fail Always - 0 + 7 Seek_Error_Rate 0x000f 078 060 030 Pre-fail Always - 71534169 +199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age Always - 0 +200 Multi_Zone_Error_Rate 0x0000 100 253 000 Old_age Offline - 0 +SMART Error Log Version: 1 +No Errors Logged +~~~ + +### CPU/RAM +~~~ +# grep -ri Oops /var/log/ +# grep -ri threshold /var/log/ +# grep -ri Segfault /var/log/ +~~~ + +## IP FailOver + +OVH propose l'utilisation d'adresses IP supplémentaires sur un serveur et potentiellement +"transportables" sur un autre serveur, d'où leur nom _IP FailOver_. + +Pour en ajouter une, il faut remplir un petit formulaire dans le manager, puis on +ajoute une configuration de ce type sous Debian (attention, le masque est bien un /32 !!) : + +~~~ +auto eth0:0 +iface eth0:0 inet static + address 192.0.43.2 + netmask 255.255.255.255 +~~~ + +## IPv6 + +L'IPv6 d'un serveur dédié OVH est notée dans le manager sous la forme d'un réseau /64 +...néanmoins la gateway doit être calculée en dehors de ce réseau... du coup +soit vous mettez simplement un /56, soit vous devez mettre des routes un peu tordues. + +Voici la configuration conseillée : + +~~~ +iface eth0 inet6 static + address 2001:1234:5:6789::1 + netmask 64 + # Deprecated netmask 56 + # Deprecated up ip route add 2000::0/3 via 2001:1234:5:67ff:ff:ff:ff:ff +~~~ + +Les documentations OVH semble être dépréciés. Les routes sont annoncés par des RA. Il suffit donc de positionner une adresse IPv6 et de ne pas se préoccuper de la gateway. + +Voir et des commentaires comme et + +## Firewall Cisco ASA + +Il est possible d'associer à un serveur dédié un firewall Cisco ASA, en mode transparent. Attention le mode transparent implique qu'il ne sera pas possible de monter des VPNs. OVH ne supporte pas encore le mode routé. +La configuration du firewall est disponible en HTTPs (client java) ou en CLI via ssh. + +## Nouvel antispam OVH + +La détection de spams se fait en temps réel sur les emails envoyés. + +Lorsqu'une adresse IP est identifiée comme émettrice de spam, le port 25 est bloqué via VAC. On peut notamment vérifier le blocage sur l'interface d'admin beta : + +Le déblocage se fait via l'interface API : + +Se connecter avec des identifiants OVH. Par la suite , il faut sélectionner "/ip" puis "/ip/{ip}/spam/{ipSpamming}/unblock" (icône POST en début de ligne), entrer l'IP de son serveur dans les zones "ip" et "ipSpamming" puis cliquer sur "Execute" + +Vous pouvez utiliser le lien pour vérifier si l'IP a été bien débloqué ou pas. + +Si l'IP est de nouveau détectée comme "spammeuse", elle sera bloquée de nouveau, le déblocage sera alors possible après 24h. +Si l'IP est détectée une nouvelle fois, elle sera bloquée pour 30 jours. + +Note : via le nouveau manager, on peut le faire directement via + +## "Support" OVH + +Joindre le support "technique" au 08.99.70.17.61 (1,349€/appel + 0,337 €/min) n'a que très peu d'intérêt +car ils ont uniquement accès en lecture aux différents éléments que vous avez déjà (tickets, etc.). + +L'astuce est de joindre le 09.74.53.13.23 (non surtaxé) où un opérateur a simplement un accès à l'outil +de tickets mais peut relancer les "vrais" techniciens par messagerie instantannée. En cas d'urgence, +l'idéal est donc d'ouvrir un ticket, de relancer immédiatemment au 09.74.53.13.23 puis de prier. + +État des serveurs OVH dans leurs différents datacenters : +(les détails de placement de chaque serveur sont visibles dans le Manager OVH) \ No newline at end of file diff --git a/ServeurOVH/vKVM.md b/ServeurOVH/vKVM.md new file mode 100644 index 00000000..12e62174 --- /dev/null +++ b/ServeurOVH/vKVM.md @@ -0,0 +1,27 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# OVH vKVM + +Doc officielle : + +## Qu'est ce que c'est ? + +Virtual KVM est une innovation OVH. Grâce à la virtualisation, on démarre le serveur sur un système minimaliste : vKVM. Ce système permet de lancer en virtualisation un serveur dédié et de suivre son démarrage comme sur un écran. + +Grâce à vKVM on peut aussi démarrer un serveur sur un ISO grâce à ftpfs ou sur le disque flash USB et faire les manipulations via vKVM avec le clavier et la souris via une applet Java (VNC/SSL) qu'il faut avoir d'installé (je conseille l'utilisation de l'eeePC). + +On peut suivre le démarrage du système comme sur un écran et donc voir le dmesg. + + +## Obtenir vKVM + +Pour l'utiliser, rendez vous dans le manager et, dans services, choisir Netboot, puis vKVM. + +Ensuite, redémarrer le serveur. On reçoit un email avec les login/password et une URL... et c'est parti ! + + +## Une fois sur l'écran du vKVM + +On choisit si on veut démarrer le système sur le disque ou sur une image dont on spécifiera le chemin ftps, et on clique sur démarrer. + +Ensuite, dans l'applet du dessous, le système boot. \ No newline at end of file diff --git a/ServeurOrangeFCE.md b/ServeurOrangeFCE.md new file mode 100644 index 00000000..acf82bf2 --- /dev/null +++ b/ServeurOrangeFCE.md @@ -0,0 +1,140 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# OBS Orange Business Services FCE Flexible Computing Console + +[[Image(FCE_accueil.png)]] + +## Lexique + +BVPN -> Business VPN[[BR]] + +VDC -> Virtual Data Center + +## Créer une VM + +### Allouer plus de ressources + +La première chose à faire est de se rendre sur "tableau de bord" à l'onglet ressources pour constater les ressources dipsonibles. + +[[Image(FCE_ressources.png)]] + +Dans la partie "serveurs" on peut voir le dimensionnement actuel de nos VMs. + +[[Image(FCE_serveurs.png)]] + +Pour modifier un paramètre (RAM, CPU) on se rend sur la VM concernée. + +[[Image(FCE_ressources_VM.png)]] + +Et on clique sur modifier. + +[[Image(FCE_modifier.png)]] + +Un redémarrage de la machine devra être effectué pour que les changements soient pris en compte + +En ce qui concerne l'espace disque, on doit se rendre dans l'onglet "périphériques" et cliquer sur l'icone représentant un crayon (en face du disque virtuel que l'on souhaite modifier). + +[[Image(FCE_machine_reseau.png)]] + +[[Image(FCE_espacedisque.png)]] + +## Le réseau + +A leur création, chaque VM se voit attribuer deux adresses IP publiques mais non routées. Une interface est estampillée trafic et l'autre service. + +[[Image(FCE_machine_reseau.png)]] + +Afin que la machine soit joignable via internet, il faudra ajouter une règle de redirection d'une IP publique vers l'adresse (interface trafic) de la machine via la section "Sécurité et réseaux" / "Adresses IP publiques / NAT" (Voir capture plus bas) et ensuite ajouter des règles de filtrage via la matrice des flux. + + +Pour créer la règle dans la matrice des flux (le terme commercial pour "parefeu") il faut commencer par créer une règle dans "Le carnet d'adresses" : sous Firewall / Adresses, choisir la zone internet dans le menu déroulant, puis "Créer une nouvelle adresse" et l'appeler "ANY", choisir comme type "Network" et "0.0.0.0" comme adresse ainsi que comme netmask. + + +À partir de là on peut créer la règle à proprement parler : il faut retourner sur "Firewall" -> "Matrice des flux" -> "Créer une règle de sécurité" -> Choisir internet comme "Zone source" et "Frontend Internet" comme zone de destination, ajouter "ANY" comme adresse source et l'adresse publique du serveur comme destination -> Et choisir "Permit" pour autoriser les communications depuis internet vers le serveur. + +Il faut répéter l'opération pour autoriser les communications depuis le serveur vers internet mais en choisissant "Frontend Internet" comme zone source et internet comme zone de destination. + +## Gérer le pare-feu + +## Bascule d'une adresse IP publique + +Lors de la migration d'une VM existante vers une nouvelle VM FCE on peut vouloir basculer une IP publique vers une IP privée différente. + +Voici la démarche à suivre : + +Se rendre sur la console FCE dans la section "Sécurité et réseaux" puis dans "Adresses IP publiques / NAT". On peut voir ici les redirections actuellement en place. + +[[Image(FCE_NAT.png)]] + +Pour migrer une redirection IP publique vers IP privée, il faut cliquer sur la poubelle située en face de la redirection. + +Une fois le redirection supprimée, l'adresse IP reste réservée pour un usage ultérieur pendant 3 jours. Vous avez donc la possibilité de la réattribuer. + +[[Image(FCE_migration.png)]] + +Si la poubelle est grisée cela signifie qu'une règle de firewall est liée à cette IP, il faudra donc préalablement supprimer cette règle pour pouvoir déplacer l'IP. Pour cela il faut se rendre dans la section "Firewall" sur la gauche, puis cliquer sur le bouton "Matrice des flux" + +[[Image(FCE_firewall.png)]] + +[[Image(FCE_matrice.png)]] + +Vous pourrez donc ici supprimer la règle concernée + +## Gérer le BVPN + +Le BVPN, est une offre Orange qui permet de relier plusieurs sites distants et un VDC FCE.[[BR]] + +Avant de configurer la partie FCE, il faut demander au client son plan d'adressage local de ses sites. Dans cet exemple on va partir sur 192.168.0.0/16 et configurer le nécessaire sur la console FCE. + +### Mettre en place le routage + +Dans sécurité & réseaux -> architecture sécurisée -> accès IPVPN. Créer une route du type 192.168.0.0/16.[[BR]] + +Dans sécurité & réseaux -> architecture sécurisée -> firewall -> adresses -> zone intranet. Créer une adresse « network » du type 192.168.0.0/255.255.0.0.[[BR]] + +Dans sécurité & réseaux -> architecture sécurisée -> firewall -> matrice des flux. Créer deux règles :[[BR]] + + Dans le sens intranet -> Front end Internet. L'adresse précédemment crée vers l'adresse du serveur.[[BR]] + + Dans le sens Front end Internet -> intranet. L'adresse du serveur vers l'adresse précédemment crée. + +### Configuration sur la VM + +Au niveau iptables il faut mettre une règle similaire à celle du pare-feu Orange : + + +~~~ +/sbin/iptables -I INPUT -i eth1 -s 192.168.0.0/16 -j ACCEPT +/sbin/iptables -I OUTPUT -o eth1 -d 192.168.0.0/16 -j ACCEPT +~~~ + +Pour s'assurer que le BVPN fonctionne, on peut faire un traceroute et constater que l'on fait plus que 1 saut. Exemple : + + +~~~ +$ mtr -r 192.168.0.1 +HOST: hbb Loss% Snt Last Avg Best Wrst StDev + 1.|-- 213.56.106.92 0.0% 10 0.7 0.6 0.5 0.9 0.1 + 2.|-- 213.56.208.78 0.0% 10 1.0 1.2 0.7 3.3 0.8 + 3.|-- 213.56.208.17 0.0% 10 0.9 1.1 0.9 1.5 0.2 + 4.|-- 90.81.231.46 0.0% 10 1.4 3.5 0.9 18.2 5.4 + 5.|-- Xe-0-3-0.AVKJ1.Avignon.Ke 0.0% 10 15.4 15.5 15.2 16.0 0.3 + 6.|-- 172.16.165.14 90.0% 10 15.5 15.5 15.5 15.5 0.0 + 7.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0 +~~~ + +On peut aussi scanner un sous-réseau pour trouver rapidement des machines Windows par exemple : + + +~~~ +# nmap 192.168.99.0/24 -p 22,80,443,445 --open + +Starting Nmap 6.00 ( ) at 2015-04-01 10:26 CEST +Nmap scan report for 192.168.99.2 +Host is up (0.0096s latency). +Not shown: 2 filtered ports +PORT STATE SERVICE +80/tcp open http +445/tcp open microsoft-ds +[…] +~~~ diff --git a/ServeurVMware.md b/ServeurVMware.md new file mode 100644 index 00000000..28bccf35 --- /dev/null +++ b/ServeurVMware.md @@ -0,0 +1,618 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto VMware + +Nous parlons ici de VMware ESXi utilisé notamment avec le vSphere Client. + +* Version 4.0 +* Version 4.1 : support "officiel" de Debian GNU/Linux 4 et 5 (32 et 64 bits) +* Version 5.0 +* Version 6.0 + +VMware ESXi/vSphere est gratuit dans sa version de base, et l'on peut s'affranchir de ses limitations via différentes licences. + +### Limitations de VMware ESXi/vSphere + +Dans la version 4.1 gratuite : + +* Permet de gérer un seul ESXi dans une même fenêtre (et donc évidemment pas de Vmotion = migration à chaud) +* Pas de limite de mémoire physique +* Limite de 6 coeurs pour un processeur physique (?) +* Limite de 4 coeurs pour une machine virtuelle (?) +* Pas d'accès à l'API Vmware (?) et donc Veam Backup inutilisable (?) +* Pas de possibilité de cloner à chaud une machine (?) + +Dans la version 5.0 gratuite : + +* Permet de gérer un seul ESXi dans une même fenêtre ; +* Limité à 32 Go de mémoire physique par CPU ; +* Limité à 8 vCPU pour une machine virtuelle. + +Dans les version 5.0 payantes : + +* Il faut avoir autant de licences que de processeurs physiques + + + + + + +## SSH + +Pour activer l'accès à la console virtuelle de ESX en SSH, il suffit de s'authentifier sur la machine physique (touche F2) et d'aller dans le menu Troubleshooting Options, puis d'activer SSH. +Il est également possible d'activer SSH depuis vphere dans configuration / profil de sécurité + +## VMDK + +Les fichiers VMDK sont des disques virtuels pour VMware. + + + +Note préalable : pour naviguer dans un "datastore" il est préférable d'utiliser WinSCP plutôt que le "Navigateur de datastore" intégré qui ne nous montre pas exactement la réalité. + +Par exemple, avec une machine virtuelle Linux sur un ESXi 4.1, on a : + +* Un fichier foo.vmdk (de moins d'1 Ko) contenant des infos sur le disque virtuel : + +~~~ +# Disk DescriptorFile +version=1 +encoding="UTF-8" +CID=28c888c9 +parentCID=ffffffff +isNativeSnapshot="no" +createType="vmfs" + +# Extent description +RW 167772160 VMFS "foo-flat.vmdk" + +# The Disk Data Base +#DDB + +ddb.adapterType = "lsilogic" +ddb.geometry.sectors = "63" +ddb.geometry.heads = "255" +ddb.geometry.cylinders = "10443" +ddb.uuid = "60 00 C2 9f 1c 11 be 03-20 bd 8d c6 d7 c6 47 e6" +ddb.longContentID = "458235d4353cf09526fd53f628c888c9" +ddb.virtualHWVersion = "7" +~~~ + +* Un fichier foo-flat.vmdk d'une taille de 80 Go. + +Lors d'une copie d'un disque virtuel, il faut copier ces 2 fichiers. + +## Performances + +Quelques "astuces" : + +* Attention, dans vSphere les graphes de performance disque sont notés en Kbps MAIS il s'agit en fait de Ko/s !! +* Les performances en utilisant SCP via SSH sont déplorables (environ 9 Mo/s). Via + +## Réseau + +* Les adresses MAC des interfaces réseau sont générées automatiquement. ATTENTION, un mode manuel est possible (et même conseillé si l'on souhaite basculer de machine sans utiliser Vmotion) MAIS l'on devra mettre dès le départ une adresse MAC manuellement pour pouvoir la repréciser sur un autre ESXi. En effet, les plages d'adresses MAC automatiques et manuelles sont différentes. +* Les cartes réseau Intel ne sont parfois pas reconnues par défaut (!!). Il faut installer un driver. Pour cela, on récupère le modèle de la carte via `lspci` + `lspci -n` et le site + Ensuite, il faut aller télécharger le driver sur on récupère alors un driver au format .zip + On doit enstuie passer l'ESXi en mode maintenance puis exécuter en SSH : + +~~~ +# esxupdate --bundle=INT-intel-lad-ddk-igb-3.1.17-offline_bundle-452075.zip update +Encountered error MaintenanceModeError: +The error data is: + Message - The following VIBs require this host to be in maintenance mode: + cross_vmware-esx-drivers-net-igb_400.3.1.17-1vmw.2.17.249663. + Please put the host in maintenance mode to proceed. + Errno - 18 + Description - Maintenance mode is not enabled or could not be determined. + # esxupdate --bundle=INT-intel-lad-ddk-igb-3.1.17-offline_bundle-452075.zip update +Unpacking cross_vmware-esx-drivers-net-igb_400.3.1.1.. ########################################################################### [100%] + +Removing packages :vmware-esx-drivers-net-igb ########################################################################### [100%] + +Installing packages :cross_vmware-esx-drivers-net-ig.. ########################################################################### [100%] + +Running [/usr/sbin/vmkmod-install.sh]... +ok. +The update completed successfully, but the system needs to be rebooted for the +changes to be effective. +~~~ + +## Mises-à-jour + +Par exemple, il faut télécharger un fichier .zip : update-from-esx4.1-4.1_update02.zip + +Puis l'appliquer via SSH (en mode maintenance), puis rebooter : + +~~~ +# esxupdate --bundle=update-from-esx4.1-4.1_update02.zip update +Unpacking cross_qlogic-fchba-provider_410.1.3.7-454520 ########################################################################### [100%] + +Unpacking cross_oem-vmware-esx-drivers-scsi-3w-9xxx_.. ########################################################################### [100%] + +Unpacking cross_oem-vmware-esx-drivers-net-vxge_400... ########################################################################### [100%] + +Unpacking cross_vmwprovider_4x.1.0.1-2.11.502767 ########################################################################### [100%] + +Unpacking cross_swmgmt_4x.1.0.1-1.4.348481 ########################################################################### [100%] + +Unpacking cross_kmodule_4x.1.0.1-1.4.348481 ########################################################################### [100%] + +Unpacking cross_omc_1.1.0-2.11 ########################################################################### [100%] + +Unpacking cross_hdr_4x.1.0.1-1.4.348481 ########################################################################### [100%] + +Removing packages :qlogic-fchba-provider ########################################################################### [100%] + +Installing packages :cross_oem-vmware-esx-drivers-sc.. ########################################################################### [100%] + +Installing packages :cross_qlogic-fchba-provider_410.. ########################################################################### [100%] + +Running [cim-install.sh]... +ok. +Running [vmkmod-install.sh]... +ok. +Running [/sbin/esxcfg-secpolicy -p /etc/vmware/secpolicy]... +ok. +The update completed successfully, but the system needs to be rebooted for the changes to be effective. +~~~ + +## iSCSI + +### Configuration réseau pour iSCSI + +Doc officielle pour ESXi 4.1 : + +Pour ajouter un stockage iSCSI via des cartes réseau dédiés, il faut configurer ces interfaces réseau. + +Via vSphere, cela se fait via : _Configuration> Mise en réseau> Ajouter gestion réseau..._ + +On ajoute une connexion VMkernel, on sélectionne la bonne carte (vmnicN) et l'on entre son adresse IP / masque. + +Si l'on a plusieurs interfaces dédiées pour l'iSCSI, on les ajoutera dans des vSwitchs séparés (ce n'est pas obligé +mais c'est plus propre...), et on aura donc autant de Ports VMKernel (interfaces vmkN) qu'il y a de cartes réseau. + +Des manipulations sont apparemment nécessaires en CLI, par exemple pour 2 cartes réseau dédiées au iSCSI, on créera +deux vSwitchs vides (chacun associé à une carte physique), puis : + +~~~ +# esxcfg-vswitch -A "iSCSI1" vSwitch1 +# esxcfg-vswitch -A "iSCSI2" vSwitch2 +# esxcfg-vmknic -a "iSCSI1" -i 192.0.43.1 -n 255.255.255.0 -m +# esxcfg-vmknic -a "iSCSI2" -i 192.0.43.2 -n 255.255.255.0 -m +~~~ + +Avec MTU = 1500 ou 9000 si l'infra supporte les Jumbo Frames. Attention, +concernant les Jumbo Frames, il faut vraiment que tous les équipements +réseau de niveau 2 le supporte, à savoir le SAN, le switch, etc. + +À voir si nécessaire mais on peut aussi passer le MTU des vSwitchs à 9000 : + +~~~ +# esxcfg-vswitch -m 9000 vSwitchN +# esxcfg-vswitch -l +~~~ + +Enfin, dans le cas où l'on passe par de l'iSCSI 100% logiciel via VMware, +on aura donc une interface (adaptateur de stockage) vmhbaNN. +En CLI, on doit apparemment ajouter explicitement les interfaces ainsi : + +~~~ +# esxcli swiscsi nic add -n vmk1 -d vmhbaNN +# esxcli swiscsi nic add -n vmk2 -d vmhbaNN +# esxcli swiscsi nic list -d vmhbaNN +~~~ + +Dans le cas d'iSCSI géré en partie par la carte (iSCSI matériel ou "offload"), +on verra a priori plusieurs interfaces vmhbaNN. + +Enfin, une fois tout en place, on pourra valider les "sessions" iSCSI via : + +~~~ +# esxcli swiscsi session list -d vmhba34 +~~~ + +### Ajouter un disque iSCSI + +Aller dans ''Configuration> Adaptateurs de stockage> iSCSI Software Adapter" et sélectionner le vmhbaNN correspondant. + +Cliquer sur _Propriétés..._ puis l'onglet _Découverte dynamique_. On peut ainsi _Ajouter..._ un serveur cible, +en entrant son adresse IP : il devrait ainsi découvrir tous les périphériques iSCSI annoncés par le SAN. + +Si plusieurs chemins sont disponibles vers les périphériques, on aura accès au menu _Gérer les chemins..._ +permettant de choisir le type de sélection de chemin : Fixed (Fixe), Most Recently Used (récemment utilisé) ou Round Robin (circulaire). + +~~~ +Fixed (VMware) The host always uses the preferred path to the disk when that path is available. +If the host cannot access the disk through the preferred path, it tries the +alternative paths. The default policy for active-active storage devices is Fixed. +Most Recently Used (VMware) +The host uses a path to the disk until the path becomes unavailable. When the +path becomes unavailable, the host selects one of the alternative paths. The host +does not revert back to the original path when that path becomes available +again. There is no preferred path setting with the MRU policy. MRU is the +default policy for active-passive storage devices and is required for those +devices. +Round Robin (VMware) The host uses an automatic path selection algorithm rotating through all +available paths. This implements load balancing across all the available +physical paths. +Load balancing is the process of spreading server I/O requests across all +available host paths. The goal is to optimize performance in terms of +throughput (I/O per second, megabytes per second, or response times). +~~~ + +Le meilleur choix en général est Round Robin (circulaire). + +Enfin, dans _Configuration> Stockage_ on ira sur _Ajouter stockage..._ puis l'on configurera le stockage, +à savoir _Disque/LUN_, choix du périphérique, etc. On aura ainsi un Datastore (Banque de données) utilisable. + +### Activer vMotion + +La fonctionnalité vMotion permet notamment de déplacer des VM d'un hyperviseur à l'autre sans downtime. + +Afin d'activer vMotion, depuis le client vsphere : + +1 - Cliquer sur l'hôte concerné[[BR]] +2 - Cliquer sur l'onglet configuration[[BR]] +3 - Dans la catégorie "Matériel", cliquer sur "Mise en réseau"[[BR]] +4 - Cliquer sur Propriétés pour le vSwitch où un VMkernel a été configuré[[BR]] +5 - Dans la boîte de dialogue, séléctionner le vmkernel dans l'onglet "Ports" et cliquer sur "Modifier"[[BR]] +6 - Cocher la case vMotion et cliquer sur "OK"[[BR]] + +## Vmware CLI + + + +Accessible via connexion SSH sur le serveur. + +Connaître la version de VMware : + +~~~ +~ # vmware -vl +VMware ESXi 5.0.0 build-469512 +VMware ESXi 5.0.0 GA +~~~ + + +Lister les machines virtuelles : + +~~~ +~ # esxcli vm process list +~~~ + +## Installation des VMwareTools + +Note : à partir de VMWare 6.0 et/ou Debian 7, il est recommendé d'installer le paquet Debian open-vm-tools (présent dans les dépôts officiels). + +Se connecter à VSPHERE et sélectionner la machine cible, puis clic droit, et "installer/Mettre à niveau les outils VMware" + +Installer les dépendances suivantes : + +~~~ +# aptitude install build-essential gcc-4.3 make linux-headers-`uname -r` +~~~ + +Puis, en SSH sur la machine : + +~~~ +# mount /dev/cdrom /mnt +# cd /tmp +# tar xvf /mnt/VMwareTools-4.0.0-256968.tar.gz +# ./vmware-tools-distrib/vmware-install.pl + +Creating a new VMware Tools installer database using the tar4 format. + +Installing VMware Tools. + +In which directory do you want to install the binary files? +[/usr/bin] + +What is the directory that contains the init directories (rc0.d/ to rc6.d/)? +[/etc] + +What is the directory that contains the init scripts? +[/etc/init.d] + +In which directory do you want to install the daemon files? +[/usr/sbin] + +In which directory do you want to install the library files? +[/usr/lib/vmware-tools] + +The path "/usr/lib/vmware-tools" does not exist currently. This program is +going to create it, including needed parent directories. Is this what you want? +[yes] + +In which directory do you want to install the documentation files? +[/usr/share/doc/vmware-tools] + +The path "/usr/share/doc/vmware-tools" does not exist currently. This program +is going to create it, including needed parent directories. Is this what you +want? [yes] + +The installation of VMware Tools 4.0.0 build-256968 for Linux completed +successfully. You can decide to remove this software from your system at any +time by invoking the following command: "/usr/bin/vmware-uninstall-tools.pl". + +Before running VMware Tools for the first time, you need to configure it by +invoking the following command: "/usr/bin/vmware-config-tools.pl". Do you want +this program to invoke the command for you now? [yes] + +Initializing... + + + +Stopping VMware Tools services in the virtual machine: + Guest operating system daemon: done + Unmounting HGFS shares: done + Guest filesystem driver: done + Adding system startup for /etc/init.d/vmware-tools ... + /etc/rc0.d/S36vmware-tools -> ../init.d/vmware-tools + /etc/rc6.d/S36vmware-tools -> ../init.d/vmware-tools + /etc/rcS.d/S38vmware-tools -> ../init.d/vmware-tools +The bld-2.6.26-2-x86_64amd64-Debian5.0.1 - vmmemctl module loads perfectly into +the running kernel. + +Could not create the '/mnt/hgfs' directory. +The filesystem driver (vmhgfs module) is used only for the shared folder +feature. The rest of the software provided by VMware Tools is designed to work +independently of this feature. + +If you wish to have the shared folders feature, you can install the driver by +running vmware-config-tools.pl again after making sure that gcc, binutils, make +and the kernel sources for your running kernel are installed on your machine. +These packages are available on your distribution's installation CD. +[ Press Enter key to continue ] + +The bld-2.6.26-2-x86_64amd64-Debian5.0.1 - vmxnet module loads perfectly into +the running kernel. + +The bld-2.6.26-2-x86_64amd64-Debian5.0.1 - vmblock module loads perfectly into +the running kernel. + +The bld-2.6.26-2-x86_64amd64-Debian5.0.1 - vmci module loads perfectly into the +running kernel. + +The bld-2.6.26-2-x86_64amd64-Debian5.0.1 - vsock module loads perfectly into +the running kernel. + +The bld-2.6.26-2-x86_64amd64-Debian5.0.1 - vmxnet3 module loads perfectly into +the running kernel. + +The bld-2.6.26-2-x86_64amd64-Debian5.0.1 - pvscsi module loads perfectly into +the running kernel. + +No X install found. + +Creating a new initrd boot image for the kernel. +update-initramfs: Generating /boot/initrd.img-2.6.26-2-amd64 + Checking acpi hot plug done +Starting VMware Tools services in the virtual machine: + Switching to guest configuration: done + Paravirtual SCSI module: done + Guest memory manager: done + VM communication interface: done + VM communication interface socket family: done + Guest operating system daemon: done + +The configuration of VMware Tools 4.0.0 build-256968 for Linux for this running +kernel completed successfully. + +You must restart your X session before any mouse or graphics changes take +effect. + +You can now run VMware Tools by invoking the following command: +"/usr/bin/vmware-toolbox" during an X server session. + +To enable advanced X features (e.g., guest resolution fit, drag and drop, and +file and text copy/paste), you will need to do one (or more) of the following: +1. Manually start /usr/bin/vmware-user +2. Log out and log back into your desktop session; and, +3. Restart your X session. + +Enjoy, + +--the VMware team + +Found VMware Tools CDROM mounted at /mnt. Ejecting device /dev/hda ... + +# reboot +~~~ + +## vCLI VMware vSphere CLI + +C'est un outil qui permet d'administrer un ESX en CLI. + +### Installation + +Le télécharger sur le site de VMware : + +Décompresser l'archive tar.gz, créer un fichier /etc/tmp-release avec à l'intérieur « ubuntu » pour faire croire que l'on est sur une Ubuntu. (L'installeur ne gère que Red Hat, Suse et Ubuntu). + +~~~ +$ tar zxvf vmware[...].tar.gz +$ cd vmware-vsphere-cli-distrib +# echo ubuntu > /tmp/temp-release +# sudo aptitude install libarchive-zip-perl libclass-methodmaker-perl libdata-dump-perl +$ sudo ./vmware-install.pl +~~~ + +Si erreur du type : + +~~~ + not set. please set environment variable ' e.g. export + . + +ftp_proxy not set. please set environment variable 'ftp_proxy' e.g. export +ftp_proxy= +~~~ + +Modifier dans le script + +~~~ + if ( !( $ftpproxy && $ { + uninstall_file($gInstallerMainDB); + exit 1; + } +~~~ + +par + +~~~ + if ( !( $ftpproxy && $ { + #uninstall_file($gInstallerMainDB); + #exit 1; + } +~~~ + +### Configuration + +Le but est de créer un fichier de configuration pour s'authentifier sans passer à chaque fois l'adresse IP, le login et le mot de passe. Pour cela il suffit de créer un fichier texte avec les informations suivantes : + +~~~ +VI_SERVER = 192.168.0.10 +VI_USERNAME = root +VI_PASSWORD = UberPass +VI_PROTOCOL = +VI_PORTNUMBER = 443 +~~~ + +Ensuite on pourra spécifier ce fichier lors de l'exécution des commandes, comme esxcli. + +~~~ +esxcli --config vmware.cfg network ip interface list +~~~ + +### top / stats + + +Stats I/O (iotop like) : + +~~~ +TERM=xterm esxtop +puis v +puis L 36 Entrée +~~~ + + +### Étendre une partition VMFS + +1. Récupérez l’ID et secteurs de la partition VMFS. Ici, c’est l’ID 3, début au secteur 10229760 et fin au secteur 860050190. + + +~~~ +$ partedUtil getptbl /vmfs/devices/disks/vml.0200010000600508b1001c504c1f73b6b6947016164c4f47494341 +gpt + 109406 255 63 1757614684 + 1 64 8191 C12A7328F81F11D2BA4B00A0C93EC93B systemPartition 128 + 5 8224 520191 EBD0A0A2B9E5443387C068B6B72699C7 linuxNative 0 + 6 520224 1032191 EBD0A0A2B9E5443387C068B6B72699C7 linuxNative 0 + 7 1032224 1257471 9D27538040AD11DBBF97000C2911D1B8 vmkDiagnostic 0 + 8 1257504 1843199 EBD0A0A2B9E5443387C068B6B72699C7 linuxNative 0 + 2 1843200 10229759 EBD0A0A2B9E5443387C068B6B72699C7 linuxNative 0 + 3 10229760 860050190 AA31E02A400F11DB9590000C2911D1B8 vmfs 0 +~~~ + + +2. Récupérez le dernier secteur du disque dur, c’est en effet à cette dernière adresse que l’on va étendre notre partition. + +~~~ + +$ partedUtil getUsableSectors /vmfs/devices/disks/vm.0200010000600508b1001c504c1f73b6b6947016164c4f47494341 +1757614650 +~~~ + + +3. Redimensionner la partition (ID 3, secteur 10229760 à 1757614650). + + +~~~ +partedUtil resize /vmfs/devices/disks/vml.0200010000600508b1001c504c1f73b6b6947016164c4f47494341 3 10229760 1757614650 +~~~ + + +4. Étendre le système de fichier (partition d’ID 3). + + +~~~ +vmkfstools –growfs /vmfs/devices/disks/vml.0200010000600508b1001c504c1f73b6b6947016164c4f47494341:3 /vmfs/devices/disks/vml.0200010000600508b1001c504c1f73b6b6947016164c4f47494341:3 +~~~ + + +Et voilà, et en plus c’est à chaud, il suffira de cliquer sur ré-analyser dans le gestionnaire de disques (de vSphere) pour voir apparaître la nouvelle taille ! + +### Liste des commandes + + + +## Vcenter server appliance + +Il s'agit d'une VM permettant l'administration d'un ou plusieurs hyperviseurs. On peut ainsi gérer un cluster de serveurs VMware. + +Cette VM s'installe de la façon suivante : + +Télécharger : + +1. Monter ou extraire le fichier ISO + +2. Ouvrir le dossier vcsa et installer le plugin + +3. À la racine ouvrir le fichier vcsa-setup.html + +4. Activer le plug-in au sein du navigateur et cliquer sur Install. + +5. Continuer le processus d'installation + +Exemple de configuration : + +~~~ +Hostname : vcenter +root / foo +SSO : administrator / bar +nom de domaine SSO : vsphere.local +nom de site SSO : default +nom du système : vcenter.example.com +IP : 192.168.0.1 +SSH activé +~~~ + + +Résumé d'installation + + +~~~ +Informations du serveur cible : 192.168.0.1 +Nom : vcenter +Type d'installation : Installer +Type de déploiement : Instance intégrée de Platform Services Controller +Configuration du déploiement : Minuscule (jusqu'à 10 hôtes, 100 machines virtuelles) +Banque de données : datastore1 +Mode Disque : thick +Mappage de réseau : Network 1 to VM Network +Allocation d'IP : IPv4 , static +Nom d'hôte +Synchronisation de l'heure : ntp.evolix.net +Base de données : embedded +Propriétés : +SSH activé = True +Programme d'amélioration du produit = Désactivé +Nom d'utilisateur SSO = administrator +Nom de domaine SSO = vsphere.local +Nom du site SSO = default +Adresse IP du réseau 1 = 192.168.0.1 +Nom d'hôte = vcenter.example.com +Masque de réseau du réseau 1 = 255.255.255.0 +Passerelle par défaut = 192.168.0.1 +DNS = 192.168.0.254 +~~~ + +Une fois l'installation terminé, pour accéder au portail vcenter : vcenter.example.com + +Identifiants : administrator@vsphere.local / bar + +Une fois sur le portail, pour ajouter des hôtes vmware, aller dans « Hôtes et Clusters » puis cliquer sur action et nouveau centre de données. + +Une fois le centre de données crée cliquer dessus puis sur action et Ajouter hôte, autant de fois que nécéssaire. + +On peut ensuite créer un cluster en cliquant sur action puis Nouveau cluster. + diff --git a/Solaris.md b/Solaris.md new file mode 100644 index 00000000..cffd760a --- /dev/null +++ b/Solaris.md @@ -0,0 +1,167 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Solaris/OpenIndiana + +## Configuration Réseau + +Désactivation de NWAM (NetWork Auto Magic), qui n'est pas pertinent sur un serveur (pas de changement fréquent d'IP ni de Wifi) : + +~~~ +# svcadm disable network/physical:nwam +# svcadm enable network/physical:default +~~~ + +Lister les interfaces physiques : + +~~~ +# dladm show-phys +LINK MEDIA STATE SPEED DUPLEX DEVICE +e1000g0 Ethernet unknown 1000 full e1000g0 +~~~ + +Lister les interfaces logiques : + +~~~ +# dladm show-link +LINK CLASS MTU STATE BRIDGE OVER +e1000g0 phys 1500 up -- -- +~~~ + +Créer une interface logique : + +~~~ +# ipadm create-ip e1000g0 +~~~ + +/!\ Sous OpenIndiana, l'argument à utiliser est encore _create-if_, il devrait être remplacé par _create-ip_ dans un future release pour s'aligner sur Solaris /!\ + +Ajouter une IP sur une interface logique : + +~~~ +# ipadm create-addr -T static -a 192.168.1.12/24 e1000g0/v4 +~~~ + +Elle doit maintenant apparaitre dans les interfaces configurées : + +~~~ +# ipadm show-addr +ADDROBJ TYPE STATE ADDR +lo0/v4 static ok 127.0.0.1/8 +e1000g0/v4 static ok 192.168.1.12/24 +lo0/v6 static ok ::1/128 +~~~ + +Ajouter la route par défaut : + +~~~ +route -p add default 192.168.1.1 +~~~ + +Les configurations faites avec les commande _dladm_ et _ipadm_ sont par défaut persistantes et survivent au reboot. + +Configurer la résolution DNS : + +~~~ +cp /etc/nsswitch.dns /etc/nsswitch.conf +echo "nameserver 1.2.3.4" >> /etc/resolv.conf +~~~ + +## Gestion des périphériques + +Sous Solaris/OpenIndiana, certains utilitaires habituellement utilisés pour lister les périphériques (block, usb, pci) ne sont pas disponibles. +Il sont remplacés par la commande _cfgadm_ qui remplace à peu prés _lspci_, _lsusb_, et _fdisk -l_ : + +~~~ +# cfgadm +Ap_Id Type Receptacle Occupant Condition +sata6/0::dsk/c3t0d0 disk connected configured ok +sata6/1::dsk/c3t1d0 cd/dvd connected configured ok +sata6/2 sata-port empty unconfigured ok +sata6/3 sata-port empty unconfigured ok +sata6/4 sata-port empty unconfigured ok +[...] +usb2/1 usb-input connected configured ok +usb2/2 unknown empty unconfigured ok +usb2/3 unknown empty unconfigured ok +[...] +~~~ + +Les disques connectés ainsi que les ports libres sont bien visibles, pour les curieux ils sont mappés dans /dev/dsk/, mais leur path complet ne sera quasiment jamais utile. + +## Utilisation de ZFS + +Voir [wiki:HowtoZFS] pour les question d'utilisation générale. + +#### iSCSI + +Installer les paquet nécessaires : + +~~~ +# pkg install pkg:/storage-server + Packages to install: 49 + Create boot environment: No +Create backup boot environment: Yes + Services to change: 4 + +DOWNLOAD PKGS FILES XFER (MB) +Completed 49/49 6848/6848 118.7/118.7 + +PHASE ACTIONS +Install Phase 9185/9185 + +PHASE ITEMS +Package State Update Phase 49/49 +Image State Update Phase 2/2 +~~~ + +Créer un volume pour recevoir les données (ici on créé un volume nommé "iscsi" de type block -- avec l'option -V -- dans le zpool "test", cf. [wiki:HowtoZFS]) : + +~~~ +# zfs create -V 90g test/iscsi +# zfs list +[...] +test 93,3G 4,43G 427M /export/test +test/iscsi 92,8G 97,3G 16,7K - +~~~ + +Ajouter le volume aux LU(s) : + +~~~ +# sbdadm create-lu /dev/zvol/rdsk/test/iscsi +Created the following LU: + + GUID DATA SIZE SOURCE +-------------------------------- ------------------- ---------------- +600144f0009a020000004f8eb38f0001 96636764160 /dev/zvol/rdsk/test/iscsi +~~~ + +Le rendre visible : + +~~~ +# stmfadm add-view 600144f0009a020000004f8eb38f0001 +~~~ + +Tout de même s'assurer que le service _target_ iSCSI est actif : +~~~ +svcs -a | grep -i iscsi +disabled 14:24:59 svc:/network/iscsi/target:default +online 13:12:57 svc:/network/iscsi/initiator:default +~~~ + +Si il ne l'est pas : + +~~~ +svcadm enable -r svc:/network/iscsi/target:default +~~~ + +Et enfin générer les targets : + +~~~ +# itadm create-target +Target iqn.1986-03.com.sun:02:21ad694e-4c6a-ec5a-9434-f3ffaf94c3da successfully created +# itadm list-target +TARGET NAME STATE SESSIONS +iqn.1986-03.com.sun:02:21ad694e-4c6a-ec5a-9434-f3ffaf94c3da online 0 +~~~ + +TODO : Gestion d'accès \ No newline at end of file diff --git a/Subuids.md b/Subuids.md new file mode 100644 index 00000000..713bcc74 --- /dev/null +++ b/Subuids.md @@ -0,0 +1,54 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Introduction + +En [avril 2014](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=739981) Debian ajoute le support pour `/etc/subuid` et `/etc/subgid` au programme `shadow`, permettant ainsi l'utilisation des Linux Containers (LXC). Cette patch est disponible à travers le packet `passwd 1.4.2-1` et est donc en place par défaut à partir de Jessie. + +## Que sont les LXC? + +Wikipedia décris les LXC comme suit: + +_LXC, contraction de l’anglais Linux Containers est un système de virtualisation, utilisant l'isolation comme méthode de cloisonnement au niveau du système d'exploitation. Il est utilisé pour faire fonctionner des environnements Linux isolés les uns des autres dans des conteneurs partageant le même noyau et une plus ou moins grande partie du système hôte. Le conteneur apporte une virtualisation de l'environnement d'exécution (processeur, mémoire vive, réseau, système de fichier…) et non pas de la machine. Pour cette raison, on parle de « conteneur » et non de machine virtuelle_. -- [Wikipedia](https://fr.wikipedia.org/wiki/LXC) + +Les conteneurs offerts par LXC ressemblent donc à ceux créés par OpenVZ. Si Docker utilisait LXC à ses débuts, ce n'est plus le cas depuis la version 0.9. + +Comme LXD est basé sur LXC, `/etc/subuid` et `/etc/subgid` sont également nécessaire à sont bon fonctionnement. + +# subuid, subgid + +## Fonction + +On utilise les subuids et les subgids avec LXC dans le but de permettre à un utilisateur qui n'est pas root de pouvoir créer de nouveaux conteneurs. Cela est normalement fait avec les deux commandes suivantes: + +* `newuidmap` +* `newgidmap` + +## Utilisation + +Les deux fichiers `/etc/subuid` et `/etc/subgid` suivent la syntaxe suivante: + +~~~ +"login name":"numerical subordinate user ID":"numerical subordinate user ID count" +~~~ + +Ainsi, si on souhaite donner à l'utilisateur `roger` les UIDs de 10200 à 10300, on ajouterait la ligne suivante: + + +~~~ +roger:10200:100 +~~~ + +La même logique s'applique pour `/etc/subgid`. + +Il n'est cependant pas nécessaire de faire ces configurations manuellement. En effet, il est possible de configuer `/etc/login.defs` pour que ces deux fichiers soient modifiés automatiquement lors de la création d'un nouvel utilisateur via `useradd` ou `newusers`. + +Les paramètres en question dans `/etc/login.defs` sont: + +* `SUB_GID_MIN` +* `SUB_GID_COUNT` +* `SUB_GID_MAX` +* `SUB_UID_MIN` +* `SUB_UID_MAX` +* `SUB_UID_COUNT` + +La création automatique des subuids et de subgids est faite seulement si les fichiers `/etc/subuid` et `/etc/subgid` existent. diff --git a/SwitchCisco.md b/SwitchCisco.md new file mode 100644 index 00000000..fd7c39be --- /dev/null +++ b/SwitchCisco.md @@ -0,0 +1,876 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto switchs Cisco + +Nous utilisons principalement des switchs Cisco Catalyst 2950/2960/2970/3750 et cette documentation sera orientée pour ces modèles. + +Ressources diverses : + +* [Liste des firmwares IOS](http://www.cisco.com/en/US/products/ps10144/prod_release_notes_list.html) ; +* [Centre de téléchargement cisco](http://www.cisco.com/cisco/software/navigator.html?mdfid=278875285&flowid=7448) ; +* [Manuel Catalyst 2970 12.1(14)EA1](http://www.cisco.com/en/US/docs/switches/lan/catalyst2970/software/release/12.1_14_ea1/configuration/guide/2970scg.html) ; +* [Manuel Catalyst 2960/2960-S 12.2(55)SE](http://www.cisco.com/en/US/docs/switches/lan/catalyst2960/software/release/12.2_55_se/configuration/guide/scg_2960.html) ; +* [Data Sheet Catalyst 3750](http://www.cisco.com/en/US/prod/collateral/switches/ps5718/ps5023/product_data_sheet0900aecd80371991.html) ; +* [Troubleshooting](http://www.cisco.com/en/US/products/hw/switches/ps708/products_tech_note09186a008015bfd6.shtml) ; +* [LED 2960S](http://travaux.evolix.net/2960S_LED.html). + +Stackable ou non-Stackable ?[[BR]] +Les switchs _-S Series_ permettent de stacker plusieurs switchs : c'est-à-dire que plusieurs switchs seront vus comme un seul, +offrant ainsi des facilités en terme d'administration (mais pas forcément en terme de sécurité). Cela se fait par exemple avec +plusieurs switch 2960-S et des modules Cisco FlexStack : ces modules s'ajoutent à l'arrière de chaque switch, il suffit ensuite +de les relier avec des câbles Cisco FlexStack.[[BR]] +Astuce : un switch stackable (S Series) est parfois moins cher qu'un non-stackable... et il peut pourtant très bien être utilisé tout seul ! + +## Administration de switchs Cisco Catalyst + +### Configuration initiale + +#### Avec un port série (old-school) + +* Raccorder le port d'administration du switch au port série d'un poste Linux à l'aide du câble fourni (couleur bleu ciel) +* Installer `minicom` et créer le fichier de configuration `/etc/minicom/minirc.cisco` avec un contenu du type : + +~~~ +pu port /dev/ttyS0 +pu baudrate 9600 +pu bits 8 +pu parity N +pu stopbits 1 +pu rtscts No +~~~ +_Note : Avec un adaptateur USB, le device est /dev/ttyUSB0 (ou autre numéro)._ + +* Exécuter la commande `minicom cisco` et observer l'initialisation du switch. A la question `Would you like to enter the initial configuration dialog?`, répondre `no` +* Passer en mode administrateur avec la commande `enable`, et afficher la configuration par défaut avec `show running-config` + +#### Avec un câble Ethernet + +Pour un switch récent, une fois allumé pour la 1ère fois, on appuye 3 à 4 secondes sur le bouton _MODE_ ce qui le fait passer en mode _Express Setup_. +Note : cela ne fonctionne que si le switch n'a jamais été configuré. + +On branche un câble sur n'importe quel port et on lance un client DHCP sur un ordinateur : + +~~~ +# dhclient -d eth0 +Internet Systems Consortium DHCP Client 4.1.1-P1 +Copyright 2004-2010 Internet Systems Consortium. +All rights reserved. +For info, please visit + +Listening on LPF/eth0/f0:de:f1:12:c9:d2 +Sending on LPF/eth0/f0:de:f1:12:c9:d2 +Sending on Socket/fallback +DHCPREQUEST on eth0 to 255.255.255.255 port 67 +DHCPNAK from 10.0.2.3 +DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 5 +DHCPOFFER from 10.0.2.3 +DHCPREQUEST on eth0 to 255.255.255.255 port 67 +DHCPACK from 10.0.2.3 +bound to 10.0.2.2 -- renewal in 271 seconds. +~~~ + +On obtient ainsi l'adresse IP actuelle du switch : 10.0.2.3 et l'on peut se connecter en telnet sans mot de passe, ou en HTTP avec cisco/cisco. +Le plus simple est a priori de le faire en HTTP où l'on renseigne une configuration IP de base et les mots de passe, et l'on sort du mode +_Express Setup_ une fois terminé. + +### Commandes de base + +Commandes de bases sous IOS : + +~~~ +Switch# show version +Switch# show mem +Switch# show processes +Switch# show process cpu +Switch# show flash +Switch# show clock +Switch# show history +Switch# show logging +Switch# show inventory +Switch# show interfaces +Switch# show interfaces status +Switch# show interfaces st +Switch# show interfaces counter +Switch# show interfaces counter errors +Switch# show interfaces Gi0/11 +Switch# show interfaces Gi0/11 status +Switch# show interfaces Gi0/11 counter +Switch# show interfaces Gi0/11 counter errors +Switch# show interfaces trunk +Switch# show interfaces description +~~~ + +#### Gestion de base de la configuration + +~~~ +Configuration en Flash +Switch# show configuration +Configuration actuelle +Switch# show running-config +Configuration actuelle d'une interface particulière +Switch# show running-config interface GigabitEthernet1/0/1 +Ecrire la configuration actuelle en Flash +Switch# write +~~~ + +#### Changer le nom d'hôte + +~~~ +Switch# configure terminal +Switch(config)# hostname sw-test +sw-test(config)# end +~~~ + +#### Changer le nom de domaine + +~~~ +Switch# conf t +Switch(config)# ip domain-name test.com +Switch(config)# end +~~~ + +#### Chiffrer les mots de passe + +~~~ +Switch# configure terminal +Switch(config)# service password-encryption +~~~ + + +#### Mise en place d'un mot de passe "enable" + +Attention : Apparaitra en clair si password-encryption n'est pas activé ! + +~~~ +Switch# configure terminal +Switch(config)# enable password le_mot_de_passe +Switch(config)# end +~~~ + +Note : si besoin de désactiver un ancien mot de passe, il peut être nécessaire de faire `no enable secret` + +#### Mise en place d'un mot de passe telnet + +~~~ +Switch# configure terminal +Switch(config)# line vty 0 4 +Switch(config-line)# password le_mot_de_passe +Switch(config-line)# login +Switch(config-line)# end +~~~ + +#### Mise en place d'un mot de passe console + +Note : ne fonctionne pas a priori... + +~~~ +Switch# configure terminal +Switch(config)# line vty 5 15 +Switch(config-line)# password le_mot_de_passe +Switch(config-line)# login +Switch(config-line)# end +~~~ + +#### Synchronisation NTP + +~~~ +Switch# ntp server 31.170.8.123 +Switch# show ntp status +Switch# show ntp associations +~~~ + +#### Infos/gestion d'une interface + + +Voir l'état et la vitesse de tous les ports : +~~~ +Switch# show interfaces status +~~~ + +Statut d'une interface : +~~~ +Switch# show interfaces GigabitEthernet1/0/48 +~~~ + + +Infos détaillées sur la config d'un port : +~~~ +Switch# show interfaces GigabitEthernet1/0/48 switchport +~~~ + +Désactiver/activer une interface : +~~~ +Switch# conf t +Switch# interface GigabitEthernet1/0/48 +Switch# shutdown +Switch# no shutdown +Switch# exit +~~~ + +Forcer la vitesse du port : +~~~ +Switch# conf t +Switch# interface GigabitEthernet1/0/48 +Switch# speed {10,100,1000,auto} +Switch# exit +~~~ + +Affecter un nom / une description à l'interface : +~~~ +Switch# conf t +Switch# interface GigabitEthernet1/0/48 +Switch# description Machine XYZ +~~~ + +Gestion du MTU pour toutes les interfaces Gigabits : +~~~ +system mtu jumbo 9000 +~~~ + +#### Gérer les fichiers/répertoires + +~~~ +Switch# cd flash: +Switch# cd rep +Switch# dir +Switch# copy foo bar +Switch# delete bar +Switch# mkdir rep +Switch# rm rep +Switch# more info.txt +Switch# verify image.bin +~~~ + +Commandes à manipuler avec précaution : + +~~~ +Switch# fsck +Switch# erase +Switch# format +~~~ + +#### Reboot complet du switch + +~~~ +Switch# reload +~~~ + +#### Reset complet du switch + +##### Avec le bouton _MODE_ + +Si l'on appuye plus de 8 secondes sur le bouton _MODE_, le switch redémarre et sera remis en configuration d'usine ! + +##### Autre méthode sans mot de passe + +Sur certains modèles, cette méthode ne fonctionne pas. Après être raccorder au switch, il faut le redémarrer en maintenant le bouton MODE enfoncé. + +Ensuite, initialiser le file system flash : + +~~~ +switch: flash_init +switch: load_helper +~~~ + +Si on veut on peut sauvegarder, ou la supprimer l'ancienne configuration : + +~~~ +switch: dir_flash: +switch: rename flash:config.text flash:config.old +~~~ + +Enfin on boot : + +~~~ +switch: boot +~~~ + + +### Sauvegardes + +Voir la liste des protocoles disponibles : + +~~~ +Switch# show file systems +File Systems: + + Size(b) Free(b) Type Flags Prefixes + - - opaque ro bs: +* 57931776 42733568 flash rw flash: flash1: + - - opaque rw system: + - - opaque rw tmpsys: + 524288 518420 nvram rw nvram: + - - opaque rw null: + - - opaque ro tar: + - - network rw tftp: + - - opaque ro xmodem: + - - opaque ro ymodem: + - - network rw rcp: + - - network rw + - - network rw ftp: + - - network rw scp: + - - network rw + - - opaque ro cns: +Switch# show flash + +Directory of flash:/ + + 581 -rwx 5 Mar 21 2012 19:19:25 +01:00 private-config.text + 582 -rwx 3096 Mar 21 2012 19:19:25 +01:00 multiple-fs + 583 -rwx 2739 Mar 21 2012 19:19:25 +01:00 config.text + 2 drwx 512 Mar 1 1993 01:14:39 +01:00 c2960s-universalk9-mz.122-55.SE3 + +57931776 bytes total (42733568 bytes free) +~~~ + + +Copier la configuration actuelle dans un fichier nommé _sauvegarde_ : + +~~~ +Switch# copy running-config sauvegarde +Destination filename [sauvegarde]? + +2739 bytes copied in 2.076 secs (1319 bytes/sec) + +Switch# show flash + +Directory of flash:/ + + 580 -rwx 2739 Mar 21 2012 19:29:32 +01:00 sauvegarde + 581 -rwx 5 Mar 21 2012 19:19:25 +01:00 private-config.text + 582 -rwx 3096 Mar 21 2012 19:19:25 +01:00 multiple-fs + 583 -rwx 2739 Mar 21 2012 19:19:25 +01:00 config.text + 2 drwx 512 Mar 1 1993 01:14:39 +01:00 c2960s-universalk9-mz.122-55.SE3 + +57931776 bytes total (42729984 bytes free) + + +Switch# delete sauvegarde +Delete filename [sauvegarde]? +Delete flash:/sauvegarde? [confirm] +~~~ + +On peut aussi envoyer la configuration sur un serveur distant : + +~~~ +Switch# copy running-config ftp:///rep/sauvegarde_29fevrier2012.txt +~~~ + +De même, on peut sauvegarder le firmware du switch sur un serveur distant : + +~~~ +Switch# cd flash:/ +Switch# cd c2960s-universalk9-mz.122-55.SE3 +Switch# dir + +Directory of flash:/c2960s-universalk9-mz.122-55.SE3/ + + 3 drwx 5632 Mar 1 1993 01:08:54 +01:00 html + 578 -rwx 10907578 Mar 1 1993 01:10:24 +01:00 c2960s-universalk9-mz.122-55.SE3.bin + 579 -rwx 484 Mar 1 1993 01:13:44 +01:00 info + +Switch# copy flash:/c2960s-universalk9-mz.122-55.SE3/c2960s-universalk9-mz.122-55.SE3.bin ftp:///rep/sauvegarde_firmware.bin +~~~ + +Pour sauvegarder la liste des VLANs, c'est le fichier vlan.dat qui nous intéresse : + +~~~ +Switch# copy flash:/vlan.dat ftp:///rep/sauvegarde_vlan.dat +~~~ + +### Mettre à jour IOS + +Si il y a assez de place sur la mémoire flash (`dir flash:`), copier le nouveau firmware dessus (`copy ftp:///fichier.bin flash:`), sinon effacer le contenu de la flash (`erase flash:`), puis placer le nouveau firmware. +Ensuite, il suffit de spécifier de charger le nouveau firmware. +~~~ +enable +conf t +system boot flash:new_firmware.bin +reload +~~~ + +### Gestion des VLANs + +#### Affecter une adresse IP à un VLAN + +~~~ +configure terminal +interface Vlan 1 +ip address 192.168.0.10 255.255.255.0 +~~~ + +#### Créer un VLAN + +Dans cet exemple, ce sera le VLAN d'ID 2 nommé "bob". + +~~~ +Switch# configure terminal +Switch(config)# vlan 2 +Switch(config-vlan)# name bob +Switch(config-vlan)# end +~~~ + +#### Supprimer un VLAN + +~~~ +Switch# configure terminal +Switch(config)# no vlan 2 +Switch(config)# end +~~~ + +#### Affecter des interfaces (ports) à un VLAN + +Dans cet exemple on affecte l'interface `GigabitEthernet 0/13` au VLAN 2 + +~~~ +Switch# configure terminal +Enter configuration commands, one per line. End with CNTL/Z. +Switch(config)# interface gigabitethernet0/13 +Switch(config-if)# switchport mode access +Switch(config-if)# switchport access vlan 2 +Switch(config-if)# end +~~~ + +On peut affecter un range de ports à un VLAN : + +~~~ +Switch# conf t +Switch(config)#interface range GigabitEthernet1/0/1-24 +Switch(config-if-range)#switchport mode access +Switch(config-if-range)#switchport access vlan 13 +Switch(config-if-range)#exit +~~~ + +#### Voir la configuration des VLAN + +##### D'un VLAN en particulier + +~~~ +Switch# show vlan +Switch# show interfaces vlan +~~~ + +##### De tous les VLAN + +Voir un résumé de la configuration : +~~~ +Switch# show vlan brief +~~~ + +Voir la configuration de tous les VLAN : +~~~ +Switch# show vlan +~~~ + +#### Faire un port trunk + +Dans cet exemple l'interface _trunké_ est l'interface `GigabitEthernet0/24` + +~~~ +Switch# configure terminal +Enter configuration commandsss, one per line. End with CNTL/Z. +Switch(config)# interface gigabitethernet0/24 +Switch(config-if)# switchport trunk encapsulation dot1q +Switch(config-if)# switchport mode trunk +Switch(config-if)# end +~~~ + +Sur les 2960, le switch ne supporte que le dot1q. On aura juste à basculer le port en mode trunk : +~~~ +# switchport mode trunk +~~~ + +Il est possible de spécifier le ou les vlans transportés par le trunk : +~~~ +# switchport trunk allowed vlan 11,13 +~~~ + +Astuce : pour ajouter un VLAN sur un trunk sans reprendre toute la liste de ceux déjà autorisés on peut utiliser la syntaxe : +~~~ +# switchport trunk allowed vlan add 42 +~~~ + +Une façon de contrôler si le trunk est bien mis en place des 2 côté est de consulter la sortie de la commande "show vlan brief". Si le port est toujours dans le vlan 1, c'est que le trunk n'est pas opérationnel (interface non montée, ou port distant non configuré en trunk). Si tout fonctionne bien, on ne doit le voir dans aucun vlan, mais on le verra en trunk dans un "show interfaces status". + +Pour afficher les VLAN autorisés sur un trunk : +~~~ +# show interfaces Gi1/0/50 trunk +~~~ + +ATTENTION : si l'on configure un port trunk, il est indispensable de créer le VLAN sur le switch, sinon cela ne marche pas ! + +### Administration à distance + +#### Par HTTP/HTTPS + +"Les interfaces web, c'est pour les lusers" : + +~~~ +Switch# conf t +Enter configuration commands, one per line. End with CNTL/Z. +Switch(config)# no ip http secure-server +Switch(config)# no ip http server +~~~ + +#### Par SSH + +Activation et ajout d'un utilisateur local : +~~~ +configure terminal +aaa new-model +aaa authentication login default local +aaa authorization exec default local +aaa authorization network default local +#username name privilege 15 password 7 le_mot_de_passe #password 0 le_mot_de_passe ==> en clair +username root privilege 15 secret 0 mot_de_passe +end +~~~ + +Important : Mettre en place le nom d'hôte et le nom de domaine. + +Activation de SSH : +~~~ +configure terminal +crypto key generate rsa +~~~ + +#### Activer SNMP + +Afin de permettre des requêtes SNMP : + +~~~ +Switch# conf t +(config)# snmp-server community public RO +~~~ + +On pourra ainsi faire des requêtes du type : + +~~~ +$ snmpwalk -v2c -c public .1 +~~~ + +#### Configuration IP + +Configuration IP de base : + +~~~ +Switch# conf t +(config)# interface Vlan1 +(config-if)# ip address 192.168.0.1 255.255.255.0 +(config-if)# no shutdown +~~~ + +La configuration IP de base permet un accès au switch via telnet + +#### Désactiver services web + +~~~ +Switch(config)#no ip http server +Switch(config)#no ip http secure-server +~~~ + +### Gestion des adresses MAC + +Lister toutes les adresses MAC connues : + +~~~ +Switch#show mac address-table +Switch#show mac address-table int Gi0/11 +~~~ + +Gestion des adresses MAC dynamiques, notamment forcer la suppression + +~~~ +Switch#clear mac address-table dynamic +Switch#clear mac address-table dynamic address +Switch#clear mac address-table dynamic interface +Switch#clear mac address-table dynamic vlan +~~~ + +Configurer des alertes lors de modifications : + +~~~ +snmp-server enable traps mac-notification change +snmp-server enable traps mac-notification move +~~~ + +Forcer des adresses MAC de façon statique : + +~~~ +mac address-table static vlan interface +~~~ + +### STP : Spanning Tree Protocol + + + + + +Le STP est un protocole permettant de détecter et désactiver automatiquement des boucles sur un segment Ethernet. +Cela permet donc d'éviter une boucle faite par erreur (ce qui en découle sur un Packet Storm et un réseau très dégradé) +...ou de créer des boucles volontairement pour assurer de la redondance ! + +Le principe de fonctionnement est qu'un des switchs est élu ROOT (racine de l'arbre STP), et qu'un coût est associé à chaque lien vers le ROOT. +Ce coût est calculé automatiquement à partir du nombre de connexions et du type de ces connexions (un lien 10Mb/s coûte 100, un lien 100Mb/s coûte 19, un lien 1Gb/s coûte 4, etc.). +Ce coût peut aussi être forcé manuellement si l'on veut influencer le calcul du STP. +Ensuite, grâce à ces coûts, si une boucle est détectée certains ports peuvent être bloqués. +Des vérifications sont réalisées régulièrement pour détecter un changement et adapter les blocages si nécessaire. + +/!\ Le _keepalive_ - élement essentiel pour STP - n'est pas activé par défaut sur les ports *SFP* d'un switch Cisco : il faut absolument l'activer si vos segments Ethernet sont propagés sur les ports SFP ! + +~~~ +Switch#conf t +(config)# int Gi0/49 +(config-if)# keepalive +~~~ + +Sur les Cisco 2960-2970, le STP est géré par VLAN on parle de « per-VLAN spanning-tree plus (PVST+) » et si le mode « Rapid » est activé de « rapid per-VLAN spanning-tree plus (rapid-PVST+) ». +La valeur par défaut de la priorité du root switch est 3276. +Le root ID est calculé avec cette priorité + une dérivation de l'adresse MAC. C'est le plus petit ID qui l'emporte. +Il peut être intéressant de changer la priorité pour choisir le switch root. +On peut aussi changer la priorité des ports (128 par défaut + coût du lien [10MBps # 100, 100Mbps 19, 1Gbps = 4]) pour influencer le calcul SPT et les connexions à désactiver. +La configuration par défaut des timers respecte les recommandations de la norme 802.1d. + +~~~ +Hello time: 2 seconds. +Forward-delay time: 15 seconds. +Maximum-aging time: 20 seconds. +Transmit hold count: 6 BPDUs +~~~ + +Il faut avoir les mêmes valeurs si d'autres équipements interviennent sur le réseau, comme des machines OpenBSD ou Linux. + +Voir les informations du STP sur le switch : +~~~ +#show spanning-tree summary +#show spanning-tree +#show spanning-tree detail +~~~ + +Activer le mode rapid STP 802.1w. + +~~~ +#conf t +(config)#spanning-tree mode rapid-pvst +~~~ + +Forcer un switch en root (la priorité sera calculée automatiquement). + +~~~ +#conf t +(config)#spanning-tree vlan 1-4096 root primary +~~~ + +Changer le coût d'un port : + +~~~ +Switch# conf t +(config)# interface gigabitEthernet 0/50 +(config-if)# spanning-tree cost 65536 +~~~ + +Changer le coût uniquement pour un ou plusieurs VLANs : + +~~~ +# spanning-tree vlan 1-4096 cost 1 +~~~ + + +### rate-limiting + +On peut forcer un port à rate-limiter à 10, 20, 30.... ou 90% de sa capacité. + +Par exemple pour rate-limiter à du 8 Mb/s : + +~~~ +int Gi0/1 +speed 10 +srr-queue bandwidth limit 80 +~~~ + +Infos sur le rate-limiting : + +~~~ +show mls qos interface GigabitEthernet0/1 queueing +GigabitEthernet0/1 +QoS is disabled. When QoS is enabled, following settings will be applied +Egress Priority Queue : disabled +Shaped queue weights (absolute) : 25 0 0 0 +Shared queue weights : 25 25 25 25 +The port bandwidth limit : 10 (Operational Bandwidth:11.12) +The port is mapped to qset : 1 +~~~ + +### Cisco L3 + +#### DHCP relay sur plusieurs VLANs + +* [Exemple de mise en oeuvre de DHCP Relay sur 2 VLANs](http://www.cisco.com/en/US/tech/tk648/tk361/technologies_tech_note09186a0080114aee.shtml) + +##### Serveur DHCP + +Côté serveur DHCP (serveur linux), configurer un subnet par VLAN. Penser aux routes permettant d'accéder à chaque réseau de chaque VLAN. +Le serveur DHCP pourra être dans un VLAN dédié. + +##### Cisco 3750 + +Pour activer le DHCP Relay, sur chaque interface VLAN, rajouter la directive _ip address helper _. + +Voici un exemple de création d'un VLAN avec l'adresse 192.168.200.1/24, faisant office de DHCP relay pour le serveur 10.0.1.2 : +~~~ +(config)#interface vlan 200 +(config-if)#ip address 192.168.200.1 255.255.255.0 +(config-if)#ip helper-address 10.0.1.2 +(config-if)#end +~~~ + +On répètera cette manipulation pour chaque VLANs et chaque subnet déclaré sur le serveur DHCP que l'on souhaite activer. + +#### Routage Inter-VLANs + +L'activation du routage inter-VLANs se fait de la manière suivante : +~~~ +(config)# ip routing +~~~ + +Tous les VLANs seront routés entre eux. Il sera possible si besoin de limiter le routage inter-VLANs grâce aux ACLs. + +#### Définir une route par défaut + +~~~ +(config)# ip default-gateway IP_routeur +~~~ + +ou + +~~~ +(config)# ip route 0.0.0.0 0.0.0.0 IP_routeur +~~~ + +### Divers + +#### Cron / tâches planifiées + +Voir + +#### Désactiver la vérification des modules GBIC + +Par défaut, CISCO n'autorise pas les modules GBIC non agréés, il faut donc désactiver la vérification des checksum des modules GBIC pour pouvoir les connecter : + +~~~ +#conf t +#service unsupported-transceiver +~~~ + +On peut ensuite les lister via : +~~~ +#show inventory +~~~ + +#### Remettre un port désactivé par errdisable + +Un port est désactivé dans divers cas, tel que la non-autorisation des modules GBIC tiers. + +~~~ +#conf t +#interface GigabitEthernet0/28 +#shutdown +#no shutdown +~~~ + +#### Consulter les informations DOM d'un SFP + +Pour surveiller la température, ou le voltage : + +~~~ +Switch# show interface transceiver +~~~ + +#### Passer un port SFP en "speed nonegotiate" + +On ne peut pas forcer la vitesse d'un port SFP... mais il faut parfois passer en "speed nonegotiate" : + +~~~ +(config-if)# speed nonegotiate +(config-if)# shutdown +(config-if)# no shutdown +~~~ + +Lire + +#### Synchro immédiate : Spanning Tree Portfast + +Lorsque l’on se branche sur un port, il faut 50s pour que l’il soit utilisable à cause du Spanning Tree. +Le Spanning Tree Portfast permet de passer un port dans l'état forwarding de façon immédiate, en lui faisant sauter les états listening et learning. +On utilisera cette commande uniquement si l'on est sûr de ne pas avoir besoin du Spanning Tree +(serveur non virtuel connecté directement au port, etc.). + +##### Activer +~~~ +(config)#interface GigabitEthernet0/28 +(config-if)#spanning-tree portfast +~~~ + +##### Désactiver + +~~~ +(config)#interface GigabitEthernet0/28 +(config-if)#no spanning-tree portfast +~~~ + +## Howto switchs Cisco Small Business + +Les switchs Cisco Small Business Pro (par exemple, le modèle Cisco ESW 500) sont en fait d'anciens switchs Linksys. Ils n'ont pas de système IOS habituel. +La connexion par le port console ou par telnet donne seulement accès à un menu interactif permettant d'effectuer seulement quelques opérations de base. On préférera donc l'utilisation de l'interface HTTP. + +Pour l'initialiser, suivre les instructions du Quick Start Guide. En résumé : + +* Brancher un câble RJ45 sur un port quelconque +* Se connecter à l'adresse IP par défaut 192.168.10.2 +* S'identifier avec cisco/cisco + +### Changer le mode (trunk, access...etc) d'une plage de ports + +Avec la WebUI ce n'est pas évident, mais il est bien possible d'appliquer une configuration à plusieurs ports d'un coup : +Dans la section "VLAN Management > Interface Settings" il suffit de configurer un port, puis en cliquant sur "Copy settings" en bas de la page, de renseigner la plage de ports à laquelle appliquer la même configuration. + +### Changer le VLAN d'une plage de ports + +Probablement dans un souci de cohérence, c'est également possible mais avec une méthode totalement différente... +Dans la section "VLAN Management > Port to VLAN" selectionner le VLAN ID désiré, et cliquer sur Go. Puis passer cocher "Untagged" au lieu de "Excluded" pour tous les ports désirés, et valider avec "Apply". +L'application des modifications est visible dans "VLAN Management > Port VLAN Membership" + +### CLI Small Business + +~~~ +Switch# wr +Switch# sh vlan +Switch# sh interface gi1 +Switch# sh interfaces status gi1 +Switch# show interface switchport gi1 + +Switch# configure terminal +Switch(config)# vlan 2 +Switch(config-vlan)# name bob +Switch(config-vlan)# end + +Switch# configure terminal +Switch(config)# no vlan 2 +Switch(config)# end + +Switch# conf terminal +Enter configuration commands, one per line. End with CNTL/Z. +Switch(config)# interface gigabitethernet0/13 + +Switch# conf terminal +Switch(config)# interface gi1 +Switch(config-if)# switchport mode access +Switch(config-if)# switchport access vlan 2 +Switch(config-if)# end + +Switch# conf terminal +Switch(config)# interface gi1 +Switch(config-if)# switchport mode trunk +Switch(config-if)# switchport trunk allowed vlan add all +Switch(config-if)# end +~~~ \ No newline at end of file diff --git a/SwitchNetgear.md b/SwitchNetgear.md new file mode 100644 index 00000000..a2d2b742 --- /dev/null +++ b/SwitchNetgear.md @@ -0,0 +1,54 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +## Switch Netgear GS724T (24 ports Gigabit) + + + +Il n'est pas vraiment manageable. On y accède par une interface web. Par défaut son adresse est 192.168.0.239 et son mot de passe password + +## Switch Netgear FSM7352S (48 ports Fast) + +Voici la config minicom (à mettre dans /etc/minicom/minirc.switch) : + +~~~ +pu port /dev/cua01 +pu baudrate 9600 +pu bits 8 +pu parity N +pu stopbits 1 +pu rtscts No +~~~ + +Quelques commandes utiles : + +~~~ +> en +(FSM7352S) #show vlan + +VLAN ID VLAN Name VLAN Type +------- -------------------------------- --------- +1 Default Default +2 Foobar Static + +(FSM7352S) #show vlan 1 + +VLAN ID: 1 +VLAN Name: Default +VLAN Type: Default + +Interface Current Configured Tagging +---------- -------- ----------- -------- +1/0/1 Include Include Untagged +1/0/2 Include Include Untagged +1/0/3 Include Include Untagged +1/0/4 Include Include Untagged +1/0/5 Include Include Untagged +1/0/6 Include Include Untagged +[...] + + +(FSM7352S) #conf +(FSM7352S) (Config)#interface 1/0/48 +(FSM7352S) (Interface 1/0/48)#vlan pvid 2 +(FSM7352S) (Interface 1/0/48)#vlan participation include 2 +~~~ diff --git a/TipsAndroid.md b/TipsAndroid.md new file mode 100644 index 00000000..7c9c23f4 --- /dev/null +++ b/TipsAndroid.md @@ -0,0 +1,224 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Android + +## Avoir un accès root + +### HTC Hero + +Il suffit d'installer UniversalAndroot.apk +Voir + +### Google Nexus 5 + +1. Délocker le bootloader + +Brancher son Nexus en USB à un ordinateur sous Debian : + +~~~ +# apt install android-tools-adb android-tools-fastboot +# adb devices +# adb reboot bootloader +# fastboot devices +# fastboot oem unlock +~~~ + +ATTENTION !! Cela efface toutes les données de votre Nexus ! + +2. Installer TWRP (image "recovery" alternative) + +Télécharger la dernière version de TWRP via puis : + +~~~ +# adb reboot bootloader + +# fastboot flash recovery twrp-2.8.7.1-hammerhead.img +target reported max download size of 1073741824 bytes +sending 'recovery' (14694 KB)... +OKAY [ 0.988s] +writing 'recovery'... +OKAY [ 1.132s] +finished. total time: 2.120s +~~~ + +Déconnecter le câble USB puis : + +- Reboot sur le bootloader +- Boot sur le recovery mode +- Swipe (à voir si absolument nécessaire) +- Reboot (cela peut être long, patience...) + +Voir + +3. Installer SuperSU en mode recovery + +Télécharger la dernière version stable deSuperSU via puis passer en mode recovery (avec TWRP) : + +~~~ +# adb push UPDATE-SuperSU-v2.46.zip /sdcard/ +3303 KB/s (4017098 bytes in 1.187s) + +# adb reboot bootloader +~~~ + +Et via "Install" sur TWRP, sélectionner le fichier UPDATE-SuperSU-v2.46.zip et l'installer. + +Puis reboot, l'application SuperSU est installée et vous permet de gérer l'accès root. + +Voir + +## Configuration avec Free Mobile + + + +## Reset d'usine du téléphone + +HTC Hero : Bouton "Home" et "Back", puis "On" + +## Le Bootloader + +HTC Hero : Bouton "Back", puis "On" + +Google Nexus 5 : Bouton "Volume Down" + "On" + +## Mode RECOVERY + +HTC Hero : Bouton "Home", puis "On" + +Le SYSTEM RECOVERY est géré avec une ROM spéciale... qui peut être flashée ! + +Pour le HTC HERO, la ROM la mieux semble être "RA-hero" + +Pour Google Nexus 5, TWRP + + + + +Le SYSTEM RECOVERY permet notamment : + +* d'avoir un accès root ! +* de gérer des backups (cf ci-dessous) + +## SAFE MODE + +Avec le Google Nexus 5, il faut presser quelques secondes pour faire apparaître "Éteindre" sur l'écran. +Puis presser plusieurs secondes sur "Éteindre" ce qui fera apparaître la proposition de reboot en Safe Mode. + +## NANDROID BACKUP + +Dans le SYSTEM RECOVERY, on peut créer des backups. +Les backups sont stockés sur la SDCARD, dossier "nandroid". +On peut aussi restorer le dernier backup. +Pour un backup spécifique, il faut tricher avec les dates des backups :) + + + + +## UPGRADE RECOVERY SYSTEM + +Pour récupérer le SDK => + +~~~ +# ./android-sdk-linux_86/tools/adb -d shell +/ # mount -a +mount: mounting /system/modules/modules.cramfs on /system/modules failed: No such file or directory +mount: mounting /system/xbin/xbin.cramfs on /system/xbin failed: No such file or directory +# ./android-sdk-linux_86/tools/adb push recovery-RA-hero-v1.7.0.1.img /sdcard/recovery-RA-hero-v1.7.0.1.img +1591 KB/s (4067328 bytes in 2.496s) +# ./android-sdk-linux_86/tools/adb -d shell +/ # flash_image recovery /sdcard/recovery-RA-hero-v1.7.0.1.img +flashing recovery from /sdcard/recovery-RA-hero-v1.7.0.1.img +~~~ + +## RADIO ROM + +Un téléphone contient une RADIO ROM qui est une sorte de liste des fréquences +radio possible. On peut donc mettre à jour cette radio ROM. Voir : + + +On peut flasher via fastboot : + +~~~ +# fastboot flash radio radio-hammerhead-m8974a-2.0.50.2.26.img +~~~ + +## La ROM PRINCIPALE + +Il existe de nombreuses ROMs, c'est dur de choisir, voir : + + +Il faut : + +* Vider tous les caches +* Reformater la SDCARD +* Placer la ROM (.zip) dans le répertoire principal de la SDCARD. + par exemple VillainROM12.0.0-Full-signed.zip + +~~~ +# uname -a +Linux localhost 2.6.29-ninpo-freqtwk@titan-dirty-b7a296fa #39 PREEMPT Tue Jun 29 15:57:27 BST 2010 armv6l GNU/Linux +~~~ + +Voir : + + + +## Dev Android + +* Telecharger le SDK +* Installer "ant", "java-jdk" (javac) +* Créer l'application : +~~~ +$ ./tools/android create project -t 1 -n test -p /tmp/test -a A9 -k com.example.myandroid +$ cd /tmp/test +~~~ + +Hack : + +~~~ +$ vim src/com/example/myandroid/A9.java +$ vim ./res/layout/main.xml +$ vim ./res/values/strings.xml +~~~ + +~~~ +$ ant debug +$ ant release +~~~ + +~~~ +$ upload bin/*.apk ! +~~~ + +Codes : + + + + + + +## Réinstaller de zéro + +On peut réinstaller une factory image (ce qui va dans la partition /system). +Pour les Google Nexus, voir + +Attention, il faut utiliser une machine avec plus de 2 Go de RAM libre, sous peine d'avoir +des "failed to allocate" ou "Processus arrêté" (OOM) ou "critical error: extent_create_backing: calloc: Cannot allocate memory" + +~~~ +# wget +# tar xvf hammerhead-lmy48m-factory-bf3c82fd.tgz +# cd hammerhead-lmy48m + +# fastboot devices + +# sh -x flash-all.sh + ++fastboot flash bootloader bootloader-hammerhead-hhz12h.img ++fastboot reboot-bootloader ++sleep 5 ++fastboot flash radio radio-hammerhead-m8974a-2.0.50.2.26.img ++fastboot reboot-bootloader ++sleep 5 ++fastboot -w update image-hammerhead-lmy48m.zip +~~~ \ No newline at end of file diff --git a/TipsDelivrabilite.md b/TipsDelivrabilite.md new file mode 100644 index 00000000..9394ca0e --- /dev/null +++ b/TipsDelivrabilite.md @@ -0,0 +1,12 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Delivrabilité + +## Contacts des principaux FAIs + +* Free : +* Orange : +* Hotmail/Outlook/Microsoft : +* Yahoo : ... plus récemment : +* La Poste : +* GMAIL : (NE REPONDENT JAMAIS !!!) diff --git a/TipsDevPHP.md b/TipsDevPHP.md new file mode 100644 index 00000000..5e1be2a0 --- /dev/null +++ b/TipsDevPHP.md @@ -0,0 +1,17 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto PHP + +## Debug PHP + +Infos de debug dans le code : + +~~~ +print_r( debug_backtrace() ); die(); +~~~ + +Infos dans le error_log : + +~~~ +error_log( print_r( debug_backtrace() ,TRUE)); +~~~ diff --git a/TipsDevWeb.md b/TipsDevWeb.md new file mode 100644 index 00000000..f3954c77 --- /dev/null +++ b/TipsDevWeb.md @@ -0,0 +1,84 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Best Practices du développement web + +Voici quelques conseils que nous recommandons fortement aux développeurs web. + +## Scripts en crontab + +* Un script en crontab devrait renvoyer ses erreurs sur _stderr_ +* Un script en crontab ne doit renvoyer sur _stderr_ qu'en cas d'erreur +* Un script en crontab ne doit pas rediriger _stderr_ dans un fichier (exemples à ne pas reproduire: `2> cron_err.log` ou `> cron_err.log 2>&1`) +* Un script en crontab ne doit rien renvoyer sur _stdout_ +* Un script en crontab devrait être lancé avec une option _-quiet_ ou _-cron_, permettant de + le lancer en mode interactif sans cette option et d'obtenir des informations (sur _stdout_) +* Un script en crontab ne devrait pas faire de requête en curl/wget sur _localhost_ ...surtout si + le script demande beaucoup de ressources ! [[BR]] L'utilisation d'un langage CLI est conseillé. [[BR]] + *[PHP]* Dans le cas de PHP, il faut par exemple utiliser PHP CLI (qui a souvent des limitations moins restrictives qu'en mode web) +* Un script doit être lancé dans lancé dans la crontab de l'utilisateur, JAMAIS EN ROOT +* Si un script est lancé dans la crontab de root (pour une mauvaise raison donc), il ne doit être accessible que par root (en écriture ET lecture) +* Si un script lancé dans la crontab de root a des droits Unix 777, merci de vous pendre. +* Un script en crontab ne devrait pas être lancé à la minute 0, et surtout pas à 00h00. Ces heures sont maudites par tout sysadmin. + +## Gestion des droits + +* masque # 027 en mode FTP/SFTP VS masque 077 en mode web +* Si besoin des droits d'écriture pour le web : +~~~ +chmod g+w +~~~ + +* Un fichier avec les droits 777 (ou 666) provoque la fonte de la banquise, dégage du CO2 et tue des bébés chats. + (même le site Internet du diable lui-même n'a pas de fichier en 666.) + +### Détection des droits incorrects + +* Détecter les fichiers non lisibles par Apache (lecture sur le groupe) : +~~~ +find ./ -type f ! -perm /g=r -exec ls -l {} \; +~~~ + +* Détecter les répertoires non lisibles par Apache (lecture/exécution sur le groupe) : +~~~ +find ./ -type d \( ! -perm /g=r -o ! -perm /g=x \) -exec ls -ld {} \; +~~~ + +* Détecter les fichiers/répertoires accessibles en écriture par Apache (écriture sur le groupe) : +~~~ +find ./ -perm /g=w +~~~ + +* Détecter les fichiers/répertoires accessibles en écriture par tous : +~~~ +find ./ -perm -007 -o -type f -perm -006 +~~~ + +### Wordpress + + + +Les droits d'écriture ne sont requis dans un cas général, mais voici les changements de droits souvent requis : + +* Autoriser les uploads : +~~~ +chmod -R g+w wp-content/uploads/ +~~~ + +* Gérer des règles d'écritures via Wordpress : +~~~ +chmod 660 .htaccess +~~~ + +* Pour éditer des thèmes via l'éditeur en ligne de Wordpress : +~~~ +chmod -R g+w sur les thèmes que l'on veut éditer +~~~ + +* Si répertoire de cache : +~~~ +chmod -R g+w cache/ +~~~ + +* À voir selon les plugins installés (qui doivent documenter les changements de droits nécessaires) + +## Déploiement diff --git a/TipsExtfs.md b/TipsExtfs.md index 790d8f03..8844cd1b 100644 --- a/TipsExtfs.md +++ b/TipsExtfs.md @@ -135,3 +135,14 @@ Erreur `too many links` ? Cela signifie que vous avez plus de 2^15^ (~= 32k) répertoires dans un répertoire. Il faut envisager de structurer le répertoire différemment pour obtenir une hiérarchie plus profonde, avec moins d'éléments dans chaque répertoire. + +Chercher le répertoire contenant le plus de répertoires = + de inodes : +~~~ +for i in $(find . -type d); do echo $(ls -a $i | wc -l) $i; done | sort -n +~~~ + +Supprimer des vieux fichiers (+ vieux de 30 jours en modification) : +~~~ +find . -type f -mtime +30 -exec rm '{}' \; +~~~ + diff --git a/TipsWindows.md b/TipsWindows.md new file mode 100644 index 00000000..5656ec80 --- /dev/null +++ b/TipsWindows.md @@ -0,0 +1,93 @@ +**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** + +# Howto Windows + +## Windows Server 200x + +### Supprimer complètement un AD + +Pour supprimer complètement un Active Directory, une seule commande magique : + +Dans l'explorateur : + +~~~ +dcpromo /forceremoval +~~~ + +Cela le désintégrera du domaine ;-) (Jeu de mot, il sera en fait « sorti » du domaine et ne sera plus PDC, on pourra ensuite le faire joindre le domaine géré par le Samba). + +## Shell natif + +Sortir la date et heure : + +~~~ +@ECHO OFF +ECHO "%date% %time%" +~~~ + +Sortir des infos diverses : + +~~~ +echo Utilisateur = %USERNAME% +echo Machine = %COMPUTERNAME% +echo Systeme = %OS% +~~~ + +Commentaires dans un script : + +~~~ +REM Ceci est un commentaire +~~~ + +Faire uen pause dans un script : + +~~~ +pause +pause Valider +~~~ + +Redirection de la sortie vers un fichier : + +~~~ +ECHO foo >> "C:\foo\bar.log" +~~~ + +Ajuster le PATH : + +~~~ +SET PATH="C:\Program Files\cwRsync\bin";%PATH% +~~~ + +Montage/démontage de lecteurs : + +~~~ +net use X: \\192.0.43.10\XYZ +net use X: \\192.0.43.10\XYZ /persistent:yes +net use /delete X: +~~~ + +Utilisation du IF : + +~~~ +if %username%==john.doe net use Y: \\192.0.43.10\YZA +~~~ + +Appel à un script externe : + +~~~ +CALL \\192.0.43.10\foo\bar.vbs +~~~ + +Divers : + +~~~ +SET TERM=ansi +~~~ + +## Tips & Astuces + +### Vider le cache DNBS + +~~~ +ipconfig /flushdns +~~~