Sed, mise à jour sur distant

Salut,

J’ai des applications web (https) et services sur le serveur la_bas dont je n’autorise l’accès au client (moi) uniquement.

postfixadmin-relay, roundcube, phpmyadmin et quelques vhosts spécifiques à la gestion/surveillance.

J’ai une ip local qui est dynamique et le serveur distant, une ip fixe.

La communication se fait uniquement au travers d’une connexion ssh par clé.

Sur le serveur distant, j’ai mis en place un fichier index.php qui me permet de récupérer mon ip dynamique.

<?PHP echo $_SERVER["REMOTE_ADDR"]; ?>

Depuis local, j’interroge le distant pour rapatrier¹ cette dernière.

#!/bin/bash SRC_IP="https://mon_domaine.com/index.php" MY_IP=$(wget -qO- ${SRC_IP}) echo " ${MY_IP:=127.0.0.1}" ;

Que j’enregistre dans un fichier .txt, j’y reviendrai² plus loin.

L’idée est de mettre à jour automatiquement (scripts en tâches cron) “mon ip dynamique tronquée” dans les divers fichiers de configurations ci-plus haut.

J’en suis à la phase de tests, j’ai copié (pour exemple) une section du fichier apache2.conf en local.

[code][10:29:45]:~/essai_bash$ cat /home/user/essai_bash/apache2.conf

Test mise à jour ip dynamique

2.6.000.111

2.6.000.111
2.6.000.111

1.5.000.111

2.6.2.5

2.5.2.5

DOSWhiteList 127.0.0.1
DOSWhitelist 2.5.000.111 ## mon ip dynamique tronquée

Ajoutons ici:

<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 2.5.000.111 ## mon ip dynamique tronquée

Ajoutons ici:

Je lui applique ce script pour la (substitution) mise à jour de mon ip local la_bas, via sed.

ps : soyez indulgent, je débute dans le domaine. :slightly_smiling:

Note : l’ip dynamique (FAI Orange) qui commence toujours (depuis mon abonnement de mémoire) par 2.5.xxx.xxx d’où les commandes d’éditions passées en sed.

D’ailleurs, si quelqu’un avait un début d’explication sur cette invariabilité (2.5) …

[code][10:30:33]:~/essai_bash$ cat change_ip_labas
#!/bin/sh

changeip=/home/USER/essai_bash/apache2.conf
[ -r “$changeip” ] || { echo “Je ne peux pas lire $changeip” ; exit 1; }
echo "$changeip changement ip:"
sed -i ‘s/[2]{1,3}.[5]{1,3}.[0-9]{1,3}.[0-9]{1,3}/2.5.222.333/g’ $changeip
cat $changeip

exit 0
[10:30:38]:~/essai_bash$ [/code]

Dans la pratique le script me retourne :

[10:34:25]:~/essai_bash$ ./change_ip_labas
/home/user/essai_bash/apache2.conf changement ip:
### Test mise à jour ip dynamique ###
#
# 2.6.000.111
2.6.000.111
 2.6.000.111
#
1.5.000.111
#
2.6.2.5
#
2.5.222.333
#
#
DOSWhiteList 127.0.0.1
DOSWhitelist 2.5.222.333       ## mon ip dynamique tronquée
</IfModule>


#### Ajoutons ici: ############

<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 2.5.222.333      ## mon ip dynamique tronquée
</Location>

#### Ajoutons ici: ############
[10:34:29]:~/essai_bash$ 

Cela semble fonctionnel. (?)

M’y voici, je souhaiterai inclure la valeur/expression (2.5.xxx.xxx) du fichier maj_monip-sh.txt² dans la commande sed.

Ou encore (pour l’heure, je ne sais comment) reprendre/inclure la variable ${SRC_IP} dans le script change_ip_labas¹, enfin un amalgame des deux.

La mise à jour s’effectuerait automatiquement via ssh depuis local vers distant si et seulement si :

  • l’ip local a changé et le pc local est en fonction, alors le script(s) (cron) est lancé.

Bonjour,
si tu veux être le seul à te connecter au serveur web, pourquoi l’ouvrir au monde ?

tu peux y accéder en http over ssh.

Je m’explique, tu peux cacher/protéger ton serveur derrière ton firewall en ne laissant d’ouvert que le port 22 pour tes accès ssh.
Pour accéder au serveur, tu crée un tunnel entre le porte 80/443 de ton serveur (innaccessible de l’exterieur) vers ta machine et tu peux y accéder toi seul, sans modifier la conf de apache2.

Salut,

Me serai-je mal exprimé … :think:

[quote=“moi”]J’ai des applications web (https) et services sur le serveur la_bas dont je n’autorise l’accès au client (moi) uniquement.

postfixadmin-relay, roundcube, phpmyadmin et quelques vhosts spécifiques à la gestion/surveillance.[/quote]

Concrètement, mes services/applications (virtualhosts) ci-dessus, en https, client autorisé, moi et nul autre.

<Directory /.../.../www/services/applications> Options FollowSymLinks -MultiViews -Indexes AllowOverride All Order Deny,Allow Deny from all Allow from 2.5.xxx.xxx </Directory>
Tu en conviendras, je pense. :wink:

Une protection par mot de passe (htpasswd) serait quand même bien moins… alambiquée :033

La suggestion de grigric fonctionne très bien, c’est comme ça que je fais.

D’une part tu as tes services normaux ouverts à tout le monde, sur un virtualhost qui écoute sur toutes les interfaces, ports 80/443.

D’autre part, tu mets tes services privés (administration etc) sur un autre virtualhost, qui lui n’écoute que sur 127.0.0.1, sur d’autres ports (par ex. 8080/8443). Une fois que ce virtualhost est inaccessible de l’extérieur, il te suffit de faire un tunnel SSH pour retrouver l’accès. Et comme bien entendu tu utilises des clés asymétriques gérées par ssh-agent (n’est-ce pas ?), tu peux facilement faire un script pour mettre tout ça en place automatiquement.

Si tu ne veux pas faire de virtualhost séparé tu peux toujours protéger tes services privés avec un Deny from all / Allow from 127.0.0.1 à la place, du moment qu’ils ne sont accessibles que depuis localhost ça devrait marcher pareil (perso je trouve le virtualhost séparé plus “propre” mais c’est une question de goût).

Tout l’intérêt dans les deux cas étant que c’est une configuration statique, pas besoin de toucher à tout à chaque fois que tu changes d’IP.

Utiliser ssh et de la redirection de port c’est un peu too much je trouve. Il est tout à fait possible d’utiliser SSL pour authentifier le client.

Les avantages :
[ul]
[li]c’est plus simple d’un point de vu conception (si tu fait du ssl par dessus tu ne te fade pas 2 couches de chiffrement)[/li]
[li]ça passe les firewall et les proxy d’entreprise. On reste sur un accès très classique en HTTPS sur un port 443. C’est utile en déplacement.[/li]
[li]ça marche partout même sur windows pas besoin de putty, juste d’un navigateur avec ton certificat[/li][/ul]

:slightly_smiling:

C’est avant tout un problème de connaissance/compréhension des outils. :wink:
Sur le papier tu as raison. En pratique j’ai jamais réussi à faire fonctionner ce bazar, donc forcément… (SSL c’est quand même un sacré merdier à mettre en place je trouve, même si ça simplifie les choses pour l’utilisateur final)

Et puis j’avoue, comme SSH permet de tout faire (même si ce n’est pas toujours de manière optimum) j’ai tendance à l’utiliser pour tout, avec l’avantage d’avoir une gestion unifiée – et surtout simple – des authentifications.

C’est pas si compliqué je trouve. SSL est assez sophistiqué, mais la mise en place est assez simple avianey.blogspot.fr/2012/03/ssl- … he-ca.html

Je ne connaissais pas, merci pour les infos :023

ssh est simple à utiliser, un cygwin sur une clé usb suffit, ce n’est pas plus compliqué que SSL.

Pour permettre le passage des proxy d’entreprise, on peut, soit déplacer le port de ssh en 443 ou mieux, utiliser sslh pour afficher sur le port 443 SSL et SSH.

Avoir un logiciel en plus à installer sur une clef et à configurer qui ne marche que sous windows (pourquoi utiliser cygwin plutôt que putty si ce n’est pour faire de choses overkills ?) et devoir avoir ce second logiciel lancé en permanence, c’est plus simple qu’ajouter une certificat en 3 cliques sur ton navigateur (je viens de compter c’est 5 cliques) et oublier parce qu’une fois fait tu n’aura plus jamais à faire autre chose à ce sujet ?

L’un est un gros hack (qui est très utile dans d’autres cas), l’autre est un standard IETF.

Sincèrement si c’est pour faire passer du web, pour moi, la question ne se pose pas, c’est sacrément plus simple d’utiliser SSL et on a le même niveau de sécurité.

Vous savez ce qu’on dis, quand on est un marteau tout ressemble à un clou. :slightly_smiling:

Quand tu te balades à l’extérieur, t’as intérêt à pas oublier de le supprimer ensuite du navigateur, le certificat client. Ou alors un Firefox portable sur ta clé USB. Ce qui n’est pas mieux ni pire qu’un PuTTY ou qu’un Cygwin portables. :wink:

Se balader (= utiliser un ordinateur qui n’est pas le notre ou un ordinateur portable) avec un certificat (ou une clef privée) non chiffré c’est une très mauvaise pratique quoi qu’il arrive.

D’ailleurs si tu parle sécurité, d’un coté, si quelqu’un accès au certificat il a accès à une application web qui continue de lui demander un mot de passe (c’est rare les CMS qui savent s’interfacer avec SSL, de l’autre tu lui laisse un shell sur ta machine (alors oui tu peut lui laisser uniquement un shell sécurisé, mais c’est encore de la configuration en plus (qui n’était pas mentionnée jusqu’à présent).

Cherche pas t’a tord. :laughing:

Salut,

Cette idée (post initial) que je trinqueballes depuis des mois, se voit anéanti en deux posts.

Ceci dit, sans regret ! :smiley:

grigric, j’espère que tu ne m’en voudras pas trop :wink: de ne pas avoir pris la peine de prendre en considération ta suggestion, de suite.

Dans mon cas, comme le dit syam, je connaissais l’existence des tunnels mais n’avais guère vraiment saisi son utilisation.

Lacune à présent comblée. (en partie, vu les innombrables possibilités offertes)

En fait, http over ssh, c’est exactement ce dont j’ai besoin ! :023

J’ai remué la toile depuis deux jours, sans relâche et ma besace en est toute frémissante.

Un topo sur le comment je perçois les choses à présent.

Deux scripts par virtualhosts (postfixadmin-relay, roundcube, phpmyadmin et quelques vhosts spécifiques à la gestion/surveillance.), lancés depuis local.

  • l’un pour l’activation (a2ensite) de l’un d’eux et redémarrage de l’indien “en douceur” (graceful)
  • rétablissements des droits (ci-plus bas) en /var/www/sous-domaines-truc-machin/dossier_machin/fichier_truc

  • lancement du tunnel

[08:51:45]:~$ ssh -L 59411:localhost:443 user@xxx.xxx.xxx.xxx

Connexion à l’url.

https://localhost:59411/

Je fais ma petite soupe et basta, puis extinction du tunnel (exit)

  • l’autre pour désactivation (a2dissite) de ce dernier et redémarrage de l’indien “en douceur” (graceful)
  • et sécurisation du répertoire.

[code]# find /var/www/sous-domaines-truc-machin -type f -print0 | xargs -0 chmod -t,a-rwxs,u+rw,g+r

find /var/www/sous-domaines-truc-machin -type d -print0 | xargs -0 chmod -t,a-rwxs,u+rwx,g+rx

[/code]

[code]cat sous-domaines-truc-machin.conf
<VirtualHost 127.0.0.1:443> ## Même déclaration pour tous les vhosts concernés ##

    ServerAdmin webmaster@domaine.com
    ServerName sous-domaines-truc-machin.domaine.com
    DocumentRoot /var/www/sous-domaines-truc-machin

    <Directory />
            Options FollowSymLinks
            AllowOverride All
    </Directory>

    <Directory /var/www/sous-domaines-truc-machin>
            Options FollowSymLinks -MultiViews -Indexes
            AllowOverride All
            Order Deny,Allow
            Deny from all
            Allow from 127.0.0.1
    </Directory>

# Certificat Starssl.com

    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
    SSLCertificateFile /etc/ssl/domaine.com.pem
    SSLCertificateChainFile /etc/ssl/sub.class1.server.ca.pem
    SSLCACertificateFile /etc/ssl/ca.pem
    SSLProxyEngine  on

    # Redirection vers HTTPS
    RewriteEngine   on
    RewriteCond     %{HTTPS} !=on
    RewriteRule     ^(.*)$ https://%{SERVER_NAME}$1 [L,R=301]

    ErrorLog /var/log/apache2/error.log
    LogLevel warn
    CustomLog /var/log/apache2/access.log combined
    ServerSignature On
[/code] Dans l'ensemble, cela vous semble-t-il correct ? :think:

Non. Outre le fait que je n’aime pas cette solution, je ne vois pas en quoi tu as besoin de reconfigurer apache.

Ton serveur web doit distribuer les sites que tu veux sécuriser uniquement sur l’interface local avec un numéro de port que tu choisi, 3838 par exemple. Ensuite tu fait une redirection de port qui va bien pour qu’en accédant au port 5656 de ta machine cliente, ce soit redirigée vers le port 3838 de ton serveur. Tu enregistre toutes ces infos dans ~/.ssh/config avec comme paramètre “Host bidule” et tu utilise “autossh -f bidule”.

Pas de script, si tu écris un script c’est que tu te plante.