Datei per https teilen

Du suchst ein Programm für einen bestimmten Zweck?
uname
Beiträge: 12396
Registriert: 03.06.2008 09:33:02

Re: Datei per https teilen

Beitrag von uname » 18.07.2023 08:19:16

reox hat geschrieben:Hat sich das mal wer angeschaut?^^ Nach so viele Tipps ist es ziemlich ruhig geworden :mrgreen:
Ich kann aber immer noch nicht so recht glauben, dass es genau sowas nicht schon vorher gegeben hätte...
Ich habe es mir angeschaut (auch damals), aber nicht ausprobiert (keine Zeit). Das Script scheint einen individuellen Webserver mit einem individuellen Zertifikat zu starten. Nachteil ist vielleicht, dass man über einen sicheren Weg den Befehl zum Download auf das zweite System bringen muss.

Für dich @reox scheint es einen Anwendungsfall zu lösen. Sinnvoll vor allen bei Systemen mit genau einer Person (s.u.) und wenn der Service nur selten benötigt wird.

Warum wird es von anderen nicht verwendet oder benötigt:
- Anwender verfügt sowieso über einen SSL-Webserver
- Anwender nutzt SSH anstatt HTTPS
- Anwender nutzt eine lokale Verschlüsselung (z. B. 7-Zip) und einen beliebig unsicheren Transportweg.

Nachteile deiner Lösung:
- Verwendung von Kommandozeile (Client und Server), ist aber auch ein Vorteil
- Server muss gestartet werden und auf Client warten
- Befehl für den Zugriff muss sicher ausgetauscht werden (vergleichbar mit Passwort einer 7-Zip-Datei)
- es ist "nur" eine TLS-Transportverschlüsselung und keine Ende-zu-Ende-Verschlüsselung

Vorteile:
- SSL-Zertifikat für jede Verwendung
- Server nur verfügbar wenn benötigt
- sehr minimal, kein großer Webserver usw. wird benötigt
- geringe Fehlerwahrscheinlichkeit aufgrund weniger Codezeilen

Die Lösung ist von der Idee an sich genial. Da du aber sowieso auf einen sicheren Weg den Befehl austauschen musst, könntest du anstatt nur einer TLS-Transportverschlüsselung z. B. durch Befehle wie Debianaespipe oder Debianp7zip eine Ende-zu-Ende-Verschlüsselung erreichen. Dieses hätte den Vorteil, dass unabhängig vom Transportweg die Daten sicher verschlüsselt sind. Vor allen auf Mehrbenutzersystemen wäre das sinnvoll und ein Sicherheitsgewinn, da der Administrator keinen Zugriff auf die Daten hätte.

reox
Beiträge: 2515
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Datei per https teilen

Beitrag von reox » 18.07.2023 12:22:10

Danke für den Review!
Eine Frage ist, ob in diesem Fall die Datei nicht "de-facto" Ende zu Ende verschlüsselt ist. Als Benutzer vertraue ich beiden System genug, um auf A das Script zu starten und auf B die Datei haben zu wollen. Selbst wenn Eve die Verbindung MITM, sollte das beim Verbinden von B nach A auffallen, da ich ja explizit das Zertifikat pinne.
Oder übersehe ich einen Fall, wo jemand die Datei stehlen könnte, unter der Annahme, dass ich den Systemen vertraue?
Klar, wenn weder A noch B sicher sind, kann alles mögliche passieren.

uname
Beiträge: 12396
Registriert: 03.06.2008 09:33:02

Re: Datei per https teilen

Beitrag von uname » 18.07.2023 15:01:55

reox hat geschrieben:Eine Frage ist, ob in diesem Fall die Datei nicht "de-facto" Ende zu Ende verschlüsselt ist.
Ich habe noch mal drüber nachgedacht. Ich denke auch, dass es "de-facto" Ende-zu-Ende verschlüsselt ist, da der Sender sich selbst um die TLS/SSL-Verschlüsselung kümmert und nicht einen vom Administrator bereitgestellten SSL-Webserver verwendet, wo die Datei unverschlüsselt rumliegt.

MitM in einer SSL-Verbindung sollte immer auffallen, da der Browser dann die CA-Hierachie nicht akzeptiert. Schadcode wie z. B. Emotet greift eigentlich immer den Endpoint und damit vor TLS/SSL an. Wobei Emotet ist für Linux nicht gefährlich, da er nur auf Windows lauffähig ist. :facepalm:

reox
Beiträge: 2515
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Datei per https teilen

Beitrag von reox » 18.07.2023 15:49:04

uname hat geschrieben: ↑ zum Beitrag ↑
18.07.2023 15:01:55
MitM in einer SSL-Verbindung sollte immer auffallen, da der Browser dann die CA-Hierachie nicht akzeptiert.
In diesem Fall aber nicht, da das Zertifikat selber signiert ist und die CA nicht auf dem Client liegt. Ich vertraue nur darauf, dass der Public Key Pin gleich bleibt.

reox
Beiträge: 2515
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Datei per https teilen

Beitrag von reox » 20.07.2023 07:00:01

Hab gestern noch ein paar kleine Änderungen eingebaut: Man kann jetzt auch EC statt RSA verwenden (etwas schneller im Setup) und der Port wird standardmäßig zufällig gewählt - das gibt ein wenig mehr obscurity. Außerdem hab ich auch einen Switch, um den passenden wget Befehl zu generieren.
Ein Problem dieser Lösung ist aber, dass der Server nicht entscheiden kann ob er weiter lauschen soll oder fertig ist. Ein Problem ist zB, wenn ich die Datei über einen Browser herunterladen will, dass ich erst die Sicherheitswarnung wegklicken muss - der Server aber schon die Verbindung geschlossen hat (Nachdem er nur eine Verbindung zulässt). Ein Angreifer könnte somit eine DoS machen, indem am Port angeklopft wird und mir damit die Verbindung wegnimmt.

Benutzeravatar
speefak
Beiträge: 532
Registriert: 27.04.2008 13:54:20

Re: Datei per https teilen

Beitrag von speefak » 23.07.2023 14:54:49

uname hat geschrieben: ↑ zum Beitrag ↑
07.07.2023 07:10:14
reox hat geschrieben:Die Datei in ein http zugänglichen Ordner kopieren ist möglich, aber schwierig (zB Datei zu groß)
Wenn die Datei z. B. im Ordner /root ist und dieser auf der gleichen Partition wie / ist, könntest du einen Ordner /webserverroot anlegen, diesen (dauerhaft) mit Ausführungsrechte/Leserechte für alle (inkl. www-data) ausstatten und in Apache2 irgendwie einbinden (symbolischer Link, Subdomain, ...). Nun kannst du einfach die (große) Datei in den Ordner schieben anstatt kopieren. Ohne den Namen zu kennen, wird man die Datei auch nicht zufällig finden. Ist aber in dem Fall nur eine TLS/SSL-Transportverschlüsselung bei einem SSL-Webserver.
So ungefähr hätte ich es auch gemacht, wenn die Datei /Name/Ort) ständig wechselt und recht groß ist ( kopieren vermeiden ). Apache/NGIX mit letsencrypt Zertifikat und fertig.

Erst wenn ein im Script hinterlegter wechselnder webserver request erfolgt ist, wird ein temporärer ebefalls vom script abgeleiteter stündlich wechselnder Link erzeugt. Als Grundlage für die Link und Request String habe ich die Unixtime genommen und daraus strings generiert.

=> https://www.youtube.com/watch?v=ml0iywbkRJc

Skript :

Code: Alles auswählen

#!/bin/bash
# name          : weblink4request.sh
# desciption    : create temporary file links in webserver dir after special request
# autor         : speefak ( itoss@gmx.de )
# licence       : (CC) BY-NC-SA
# version       : 0.0.4
# notice        :
# infosource    :
#
#------------------------------------------------------------------------------------------------------------
############################################################################################################
#######################################   define global variables   ########################################
############################################################################################################
#------------------------------------------------------------------------------------------------------------

ServerURL=192.168.1.20											# host URL mor IP
ServerLogfile=/var/log/apache2/access.log								# Webserver logfile
UnixEcnryptionDivisor=20										# Unixtime Divisor (unixtime "salt")
LinkSource=/home/speefak/ReaR_Backups/blackbox-gui-gnome_2023-07-22-222409_OS_NO_VBOX_DRV.iso		# link source

RandomURL=$(date +%a%b%d%e%H | md5sum | cut -d " " -f1)							# URL changes every houer (every minute: %H => %M )

TimeFrameLogCheck=2											# logfile check delay
TimeStartDownloadDelay=6										# max delay to start download

#------------------------------------------------------------------------------------------------------------
############################################################################################################
#############################################   start script   #############################################
############################################################################################################
#------------------------------------------------------------------------------------------------------------

# help dialog
if [[ -z $1 ]]; then
	echo "Usage: $(basename $0) <options> "
	printf " -s		=> sever execution \n"
	printf " -c		=> client execution \n\n"
fi

#------------------------------------------------------------------------------------------------------------

# server execution
if [[ $1 == "-s" ]]; then

	echo "execute server commands"
	
	while :; do

		RandomURL=$(date +%a%b%d%e%H | md5sum | cut -d " " -f1)					# URL changes every houer (every minute: %H => %M )
		LinkTarget=/var/www/html/$RandomURL							# link target

		rm -f $LinkTarget

		# create symlink for client request
		if [[ -n $(cat $ServerLogfile | grep $(($(date +%s)/$UnixEcnryptionDivisor))) ]]; then	# define request log expression

			echo "create symlink ($(date "+%F %H:%M:%S")): $LinkSource => $LinkTarget"
			ln -s "$LinkSource" "$LinkTarget"

			# wait for download start
			for i in $(seq 1 1 $TimeStartDownloadDelay); do
				printf '%2s\r' "wait for connection: $i sec"
				sleep 1
			done

			# check for active file download
			i=0
			while [[ -n $(ps -aux | grep wget | grep $RandomURL) ]] ; do
				printf '%2s\r' "$(echo download in progress: $LinkTarget  $i)"
				#echo "downloading file: $LinkTarget "
				sleep 1
				i=$(($i+1))

			done

			# delete symlink
			echo "delete symlink ($(date "+%F %H:%M:%S")): $LinkTarget         "
			rm -f $LinkTarget
		fi

		printf '%2s\r' "request check $(date) (every ${TimeFrameLogCheck}s)"
		sleep $TimeFrameLogCheck
	done
fi

#------------------------------------------------------------------------------------------------------------

# client execution
if [[ $1 == "-c" ]]; then

	# host request for symlink creation
	echo " host request ($ServerURL/$(($(date +%s)/$UnixEcnryptionDivisor)))"
	wget $ServerURL/$(($(date +%s)/$UnixEcnryptionDivisor)) 2>/dev/null
	sleep $(($TimeFrameLogCheck*$TimeFrameLogCheck))

	# download file
	echo " download file: $ServerURL/$RandomURL "
	wget $ServerURL/$RandomURL > /dev/null
fi

#------------------------------------------------------------------------------------------------------------

exit 0

Wechselnde Ports wie im python Script können u.U. zu Problemen führen wenn die Ports nicht auf die Rechner durch geroutet sind.

reox
Beiträge: 2515
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Datei per https teilen

Beitrag von reox » 24.07.2023 08:15:31

Auch eine interessante Lösung, insbesondere wenn ein Webserver verfügbar ist.
Aber die Datei muss dann auch vom webserver user lesbar sein, was bei mir nicht immer der Fall sein muss. Wenn die Datei zB Root gehört, kann der webserver sie nicht ausliefern.

Benutzeravatar
speefak
Beiträge: 532
Registriert: 27.04.2008 13:54:20

Re: Datei per https teilen

Beitrag von speefak » 24.07.2023 11:46:55

reox hat geschrieben: ↑ zum Beitrag ↑
24.07.2023 08:15:31
Auch eine interessante Lösung, insbesondere wenn ein Webserver verfügbar ist.
Aber die Datei muss dann auch vom webserver user lesbar sein, was bei mir nicht immer der Fall sein muss. Wenn die Datei zB Root gehört, kann der webserver sie nicht ausliefern.

Code: Alles auswählen

# create symlink for client request
		if [[ -n $(cat $ServerLogfile | grep $(($(date +%s)/$UnixEcnryptionDivisor))) ]]; then	# define request log expression

			# make source file readable for webserver
			SourcefilePermission=$(stat -L -c "%a" $LinkSource)
			chmod 777 $LinkSource

			echo "create symlink ($(date "+%F %H:%M:%S")): $LinkSource => $LinkTarget"
			ln -s "$LinkSource" "$LinkTarget"

			# wait for download start
			for i in $(seq 1 1 $TimeStartDownloadDelay); do
				printf '%2s\r' "wait for connection: $i sec"
				sleep 1
			done

			# check for active file download
			i=0
			while [[ -n $(ps -aux | grep wget | grep $RandomURL) ]] ; do
				printf '%2s\r' "$(echo download in progress: $LinkTarget  $i)"
				sleep 1
				i=$(($i+1))
			done

			# reset source file permission
			chmod $SourcefilePermission $LinkSource

			# delete symlink
			echo "delete symlink ($(date "+%F %H:%M:%S")): $LinkTarget         "
			rm -f $LinkTarget
		fi
Zugriffsrechte sind so auch kein Problem mehr :)

Benutzeravatar
speefak
Beiträge: 532
Registriert: 27.04.2008 13:54:20

Re: Datei per https teilen

Beitrag von speefak » 24.07.2023 11:49:45

reox hat geschrieben: ↑ zum Beitrag ↑
24.07.2023 08:15:31
Auch eine interessante Lösung, insbesondere wenn ein Webserver verfügbar ist.
Aber die Datei muss dann auch vom webserver user lesbar sein, was bei mir nicht immer der Fall sein muss. Wenn die Datei zB Root gehört, kann der webserver sie nicht ausliefern.
Hat den Vorteil, dass man sich nicht um die TLS/SSL Zertifikate kümmern muss und es i.d.R. zu weniger Fehlermeldungen wegen selbst erzeugter Zertifikat gibt.

reox
Beiträge: 2515
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Datei per https teilen

Beitrag von reox » 24.07.2023 12:53:53

speefak hat geschrieben: ↑ zum Beitrag ↑
24.07.2023 11:46:55

Code: Alles auswählen

			chmod 777 $LinkSource

Zugriffsrechte sind so auch kein Problem mehr :)
Uff, ok das hatte ich nicht gesehen... Das ist gar nicht gut - weil die Datei die ich teilen will, möchte ich im Idealfall gar nicht angreifen.
speefak hat geschrieben: ↑ zum Beitrag ↑
24.07.2023 11:49:45
Hat den Vorteil, dass man sich nicht um die TLS/SSL Zertifikate kümmern muss und es i.d.R. zu weniger Fehlermeldungen wegen selbst erzeugter Zertifikat gibt.
Das löse ich, indem ich explizit den Pin vom Zertifikat angebe und alle anderen Checks abschalte. IMHO die sicherste Variante, um sicherzustellen, dass der richtige Server verwendet wird.

Benutzeravatar
speefak
Beiträge: 532
Registriert: 27.04.2008 13:54:20

Re: Datei per https teilen

Beitrag von speefak » 24.07.2023 15:18:47

Den Permission Teil hatte ich just ergänzt, du hast es nicht übersehen - es war bei version 0.0.3 nicht Teil des Codes ;)

Wenn die Datei in keinster weise verändert werden soll/darf bietet sich noch mount an:

Code: Alles auswählen

SourceDir=$(SourceDir aus $LinkSource parsen)
mount --bind -o allow_other,followsymlinks $SourceDir $TmpDir
ln -s $TmpDir/$SourceFile $Linktarget

reox
Beiträge: 2515
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Datei per https teilen

Beitrag von reox » 24.07.2023 17:24:04

naja das löst das grundlegende Problem nicht ganz. Auch hier kann ein anderer Nutzer die datei möglicherweise lesen. Außerdem steigert es die Komplexität. Irgendwann muss man noch umount ausführen, den link löschen etc... (wenn man schon einen mount macht, braucht man den link aber auch nicht unbedingt). Also ja, mag in manchen Situationen ein valider Ansatz sein - ich hätte das aber trotzdem gerne "in place" erledigt gehabt.

Antworten