Refreshed episodes/hosts/comments/series from hpr.sql, and added official HPR transcripts for the 180 episodes aired since the last sync (hpr4516-hpr4695).
244 lines
22 KiB
Plaintext
244 lines
22 KiB
Plaintext
Episode: 4569
|
|
Title: Kiosk with guest mode on Linux
|
|
Source: https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr4569/hpr4569.mp3
|
|
Transcribed: 2026-07-31 16:14:07 (official HPR transcript)
|
|
|
|
---
|
|
|
|
This is Hacker Public Radio Episode 4569, for 2026-02-05
|
|
Today's show is entitled, "Kiosk with guest mode on Linux"
|
|
The host is Klaatu and the duration is 00:23:57
|
|
The flag is Clean, and the license is CC-BY-SA
|
|
The summary is "Use GDM and either a ramdisk or systemd to create a guest profile with self-removing user data"
|
|
Hey, everybody. It's glad to. There used to be a sort of a really convenient mode or add-on.
|
|
I guess to most Linux distributions, I feel. And it was this guest mode. It was a guest user profile.
|
|
You could enable this through a package frequently called X guest. And it would add a user to your login screen called guest.
|
|
So you could let a friend or colleague use your computer as a guest. And they could, they would get their own profile.
|
|
They could do whatever they want to, you know, within within the bounds of what a user is normally allowed to do on the system.
|
|
And then when they log out, every all trace of their activity is simply discarded.
|
|
It's just removed. And so every time you log into the guest profile, it's a fresh profile. It's brand new as if no one had ever been there before.
|
|
It was a really useful thing because you don't really, I mean, a lot of people will just hand their laptop to someone else.
|
|
And just, sure, you can use the web browser or whatever. I never liked doing that for lots of different reasons.
|
|
But I mean, primarily, because I just don't want people accidentally or maliciously, but I didn't,
|
|
I didn't let people who I suspected of malice use my laptop. But accidental, just erasure of my data,
|
|
or even just messing up my environment, just moving a panel somewhere that I don't want it,
|
|
or adding an icon to a desktop by accident, by dragging it out of a folder or a menu or something.
|
|
So it's just kind of, it's safer and easier to give someone their own guest account.
|
|
Now, we don't really use X11 so much anymore. I mean, some of us do. I actually do on my slack
|
|
machine. I'm still running X11, but a lot of people have switched over to Wayland. And so the X guest package,
|
|
which does as its name sort of hints rely on Xorg, that doesn't really work. I mean, you can install the
|
|
package. You can try to log in as guest, but it doesn't deliver a desktop as I've recently found out.
|
|
So I, I needed a guest account for a project that I was working on. And the advantage of the
|
|
guest account was exactly as I mentioned. The total erasure of all user data, indiscriminate,
|
|
just don't need it anymore. When someone logs out, we want to lose all of that data. Now,
|
|
this particular project was brought to me by a friend in New York, upstate, New York.
|
|
And it's for a library. So the library wants to have guest computers that people can use,
|
|
surf the internet, search the card catalog, or whatever you call it, the stacks, whatever. And then
|
|
when they log out, or they could do other stuff too, they can research online, they can write
|
|
stuff in LibreOffice, they could, I don't know, do graphics and gimp or einkscape or whatever. You know,
|
|
like whatever is available on the computer, they have access to that. They can save files,
|
|
maybe to save it to the internal hard drives so that they can then move it to some cloud account,
|
|
or whatever mechanism. I'm not sure if they have physically as attached storage or not. But when
|
|
they log out, everything that they've done needs to be erased for privacy purposes, for data
|
|
security purposes, for all of the reasons. So my friend who's volunteering at this library, it was
|
|
looking for a solution to provide this guest account or this kiosk mode experience on just some
|
|
Linux distribution. I had Fedora 43 on hand, so I decided to kind of poke around and see what
|
|
I could come up with because I had it in my head that GDM, the Genome Display Manager, that's the
|
|
screen that you get when you first log in, or when you're about to log in to a Linux graphical desktop,
|
|
that's running the Genome Desktop. You generally see the GDM. It's not always true. They might use
|
|
their own display manager. They might use a different one that then activates Genome. But a lot of times
|
|
the Genome sort of the default setup for a Genome Linux distribution, a Linux distribution using Genome,
|
|
is going to be GDM for the login screen, and then that will pass you over to the Genome desktop
|
|
after you enter your credentials. So I had it in my head that GDM was aware of session states.
|
|
And I thought I wonder if GDM has some kind of mechanism to trigger shell scripts or applications
|
|
or actions of some type based on the session state. Yes, it does. Turns out that it absolutely
|
|
does. So the default behavior of GDM is to track I think four or five different states. There's
|
|
init. That's the initial state. The initialization state post log in. So that's the moment that
|
|
someone has entered their correct, authentic, their correct credentials. Pre-session. So that's the
|
|
time before the session actually begins. Like moments before the session begins. And then post
|
|
session, which is once the log out command or the log out signal has been sent to the Genome
|
|
desktop. Each of these states has a directory located in slash Etsy slash GDM. And it turns out
|
|
that when you place a, for instance, a shell script named default with a capital D default in one of
|
|
those directories, GDM runs the script when that state is reached. So if you want something to trigger
|
|
upon that at the post session stage, then you'd put a shell script called default into slash
|
|
Etsy slash GDM slash post session. In fact, there's there may already be a shell script there
|
|
called default with some sample commands or maybe just a header comment telling you what the
|
|
script does. But it, that's all you need to do is put default into slash Etsy slash GDM slash
|
|
post session in this case for, for a log out action to trigger that shell script. The shell script
|
|
needs to be executable. I think it needs to be a valid shell script. And that's it. Otherwise,
|
|
you have full control. You, you can do whatever you want to in that script. It's pretty cool. So
|
|
to trigger actions, for instance, to clean up a user's environment upon log out, I created
|
|
slash Etsy slash GDM slash post session slash default. You can add whatever actions you want
|
|
to run on log out in this script. And in my case, I wanted to clear everything all all data.
|
|
Couple of different ways to do this. I chose the really sort of hefty choice of just removing
|
|
dash RF dollar sign home. Now, I didn't do that outright because that would then clear every
|
|
user's data upon log out, bad idea. Instead, I mean, that might be what you want. But for me,
|
|
I just wanted the guest account to have the home removed. So I did an if statement, if space
|
|
square bracket space, quote, dollar sign user, close quote equals quote library guest,
|
|
close quote space square bracket, semicolon, then Rm space dash RF space dollars, uh, yeah,
|
|
quote dollar sign home, close quote, and then F i to end the if statement and then exit zero to
|
|
signal that yes, we are exiting with success. And so that's comparing the the environment variable
|
|
dollar sign user, which, which GDM specifically does recognize it uses. Even though I think that
|
|
this script is being run as root, I'm pretty sure it respects, it retains the old dollar sign
|
|
user value of the session. So I'm comparing dollar sign user to the the string library guest. And
|
|
that's a that's the name of the user that I'm going to create as my guest account. It's going to be
|
|
library guest. If your guest account is just called guest or my guest or some, you know, a
|
|
toxic penguin, whatever, then that's the name, that's the string you would want to use when
|
|
comparing dollar sign user to the name. The point is that this if statements, if statement ensures that
|
|
the the the home directory dollar sign home is only removed if the active user that has triggered
|
|
the log out signal is library guest. If you as an admin user log in as, I don't know, admin or
|
|
plateau or gore to whatever your name is. And then you log out that's not going to trigger this because
|
|
your dollar sign user variable would not be assigned to library guest in that case. It would be
|
|
plateau or admin or gore to whatever your name is. So that protects you from accidentally clearing
|
|
out your entire home directory. That's very important. You really need to test that before engaging
|
|
in this solution because otherwise you could just clear out every manner of home directory on your
|
|
system and that would be quite upsetting if that's not what you wanted. Okay, so the the GDM
|
|
solution is pretty simple. I mean, there's no library guest user yet and that is the next thing
|
|
that you have to configure here because you do need to think about, and the reason I don't have
|
|
a library guest user on my system yet it might my pretend system that I'm talking about yet
|
|
is because we have to decide where that library user is going to, where the home directory is
|
|
going to actually be located. I mean, it's going to be in slash home slash library guest. I get that.
|
|
But what file system and the reason this came to mind is because I was thinking about the, you know,
|
|
the erasure of all data on log out and I thought, well, what happens when a user doesn't log out?
|
|
There are lots of reasons a user might not log out. The system might be shut down out from under
|
|
them. The admin might send a shutdown signal or they might shut down. They might reboot.
|
|
There might be a power outage that the box could just lose power and shut off. None of those
|
|
involved a log out signal sent to GDM. That means that this erasure that the removal of the home
|
|
directory wouldn't be triggered, which would mean that data that you've claimed is going to remain
|
|
private and deleted upon the end of the session is now retained in this hard drive. So obviously,
|
|
you'd want to encrypt your hard drive to add a little bit of extra protection there. But it's
|
|
still didn't quite feel right to retain that data because that's a snapshot of that data, right? I mean,
|
|
that could be that that that's not great. So how can we get that data to absolutely go away
|
|
upon shutdown, reboot, or even a power outage? Well, I think the easiest way to do that is to just place
|
|
the entire home directory or the the guest users home directory in a RAM disk, a temporary file
|
|
system, saved to RAM. Now, if you've got a lot of RAM, you know, like, I don't know, eight gigabytes.
|
|
There's probably a lot in this context because you don't really need that much space in the home
|
|
directory. It's going to be a it's a temporary thing where people are just going to be browsing
|
|
the internet probably may be saving a couple of documents. Like literally you could probably make a
|
|
two gigabyte home directory and be fine. But, I mean, you have six gigs to run your system on.
|
|
But, I mean, obviously, more is better, so maybe 16 gigs, 20 gigs, 24 gigs, whatever. So you
|
|
got a lot of gigs of RAM, then you could just use a RAM disk and creating a temporary file system
|
|
on all the Linux's I know is pretty simple. You just add a line to your slash FS,
|
|
don't know slash Etsy slash FS tab. The line goes a little something like this.
|
|
Tmpfstmps and then tab slash home slash library guest. That's what that's the the
|
|
mount point we we're creating here. tab tmpfs. That's the file system type. tab rw's comma no
|
|
s uid comma no dev comma size equals 2g or 4g or however big you want to make that partition or
|
|
that mount point rather and then tab 0 space 0. You can look up all of those options in the
|
|
man page of sfst tab. But, essentially, that's making a mount point called slash home slash library
|
|
guest right within your RAM as if though it was a hard drive on your system. It's only being ram.
|
|
It's only going to last as long as it has power. So anything saved to that drive disappears
|
|
upon reboot or shut down or a power outage. I think two gigs honestly is probably plenty of space
|
|
for just internet browsing and making a few documents here and there. But you could make it bigger
|
|
if you anticipate that your guest users are going to be doing more than than those basic activities.
|
|
I have a RAM disk on my computer that I use for my downloads folder and it is I think eight
|
|
gigabytes and that's plenty of space for a bunch of you know a reasonable number of large downloads
|
|
and it all just goes away when I shut down. Okay, next you need to actually create the library
|
|
guest user. You have to do this manually because of no system setting panel that I've seen lately
|
|
lets you do advanced tasks like assigning a different home directory to a user. So if you do it manually
|
|
you can do that. I do that with user add. Sudo user add space dash dash home dash dur slash home
|
|
slash library guest. So we're just pointing the home dur to the the RAM disk that we're creating.
|
|
And then space library guest. Cool. Now that user exists you do get a warning here that the home
|
|
directory slash home slash library guest already exists or if you don't get a warning about that
|
|
I guess I forgot to mention after adding it to fs tab you would want to mount slash home slash
|
|
library guest. Then you can do the user add command. As I said you'll get a warning it might tell you
|
|
that it already exists. It's not going to copy any files from scale directory into it. It's okay
|
|
all of that's going to be created automatically upon login. So it doesn't actually matter. Those
|
|
are just warnings that are not errors. You can ignore them. You do need to create a password for the
|
|
library guest. I was playing around with automatic logins for library guest. Not sure if I love it
|
|
because eventually people are going to log out and then they're going to get back it. So I don't know.
|
|
I just I think probably just creating a simple password just kind of makes sense. So Sudo password
|
|
or PASS WD space library guest and then give it whatever you know password you want to give it.
|
|
And then that's it. That's the guest account. It's on a ram disk. It'll go away if the power is cut
|
|
or if the user manages to get into a reboot or a shutdown state and of course because of GDM
|
|
it also gets wiped if if there's a log out condition as well. So that's really that that's
|
|
a guest account. That's everything you need. Now there is another way around this potentially
|
|
if you don't have the space or the power for ram disk and back power mean compute power. Like you
|
|
just don't have enough ram for this to work. On some small devices like Raspberry Pi you might just
|
|
might not be reasonable to say oh I'm going to sacrifice like half of my ram for this temporary space
|
|
that people may or may not use and then may or may not use very often. So maybe that doesn't make
|
|
sense. You can do all of this with system D as well or whatever in its system you happen to be using.
|
|
I was doing this on a fedora system so I just used system D. In that case you can create your own
|
|
customs service. This service is what it could be called like kiosk.service for example. And the
|
|
unit file for that would be square bracket unit close square bracket description equals kiosk
|
|
clean up square bracket service close square bracket type equals one shot exact start equals slash
|
|
USR slash local slash bin slash kiosk dash cleanup dot s h that doesn't exist yet will create
|
|
it in a moment. Square bracket install close square bracket wanted by equals power off dot target
|
|
reboot dot target and multi dash user dot target. So what this service file does is it gets triggered
|
|
every time a power off or a reboot or a startup action or event rather is received or triggered by
|
|
system D. So that covers everything but log out log out is still being handled by gdm. But because
|
|
this isn't in a ram disk in this example. Instead we're listening to it for a power off from anywhere.
|
|
It's a system wide power off. Okay. Well it will trigger our kiosk cleanup script which we haven't written yet.
|
|
A reboot same thing and even a startup startup event. And I'm doing the startup event to mitigate
|
|
against power outages unintentional power outages. If if the power fails and your computer gets shut down
|
|
once again that wasn't a power off signal that wasn't a reboot signal. That's just there's no more
|
|
power. It goes away. So in that event in that case you need to catch the fact that we're starting
|
|
back up and there may still be data hidden away in a user account that shouldn't be there. Again that's
|
|
a little bit of a security hole and makes me not super confident in that particular work around.
|
|
I'd much rather I think go with the ram disk. Technically speaking there's not a whole lot
|
|
anyone can do as long as the disk if you're using full disk encryption then that data should
|
|
still be locked away until a startup sequence begins. At which point the data is then removed.
|
|
Is there a millisecond in there where the data still exists that could theoretically be sort of
|
|
manipulated or exploited? Probably haven't tested it but definitely the ram disk I think sounds like
|
|
the the more secure way to do this. But in this context I think where there has been no guarantee
|
|
of absolute just airtight privacy. I think this is more of a more of a solution for like casual
|
|
like look you don't I don't want all of your random search histories and your caches and
|
|
downloads and save documents on my computer so it's going to be removed anytime I start up.
|
|
I think that this works for those use cases. If this is an environment where absolute privacy and
|
|
data security is required I don't think I would be using system D for that I'd be using the ram
|
|
disk at the very least. So anyway that's the caveat there. The point is the system D power off
|
|
target reboot target and multi-user target ensures that a removal script is triggered when someone
|
|
shuts down or reboots or starts up the computer. The script that I used for this I saved to user
|
|
user local bin and I called it kiosk-cleanup.sh. It's a little bit of a repeat I guess
|
|
of the gdmscript but it has to be has to be a little bit more robust so or a little bit more
|
|
complete really. So I do an rm-rf of home library guest and then I make a directory called
|
|
slash home slash library guest and then I chone dash capital r library guest colon library guest
|
|
slash home slash library guest. So I'm recreating I'm removing and then recreating an empty library
|
|
guest home. The reason I'm doing that is because there's nothing here there's nothing in this process
|
|
to restore what I've removed in this case unlike where the the gdm thing manages the session
|
|
and sets up the environment. There's that's not what there's nothing to do that here so I'm recreating
|
|
it myself. I don't have to create all the sub-director's gdm does that for me but or I guess the
|
|
scale subsystem does that for me but certainly removing and then recreating and then restoring the
|
|
permissions is important. So grant the script itself permission to run pseudo-chmod plus x slash
|
|
user local bin kiosk-cleanup.sh and now the library guest user data is erased after a log out by
|
|
gdm a reboot a shutdown or a startup by system d and again that's only necessary if you just
|
|
don't if you don't have the capacity to do it as a ramdesk. If you do a ramdesk you can just
|
|
stop after gdm and creating the ramdesk in the user really really nice. As I say there's data
|
|
privacy concerns here like if you're doing this for for the general public or even for just
|
|
friends of yours it's obviously really important to make it known to people I mean I don't know if
|
|
they care but I mean I think it's think it's our obligation as just admins to make it known to people
|
|
that the scope of what you're assuring them or what you're guaranteeing them. So if it's on a
|
|
ramdesk and gdm as you're doing the erasure after a log out you probably have a pretty good cause
|
|
just to say that you know that yes their data is erased upon log out. I don't think the reboot
|
|
and shutdown power off really matters or that that'll go away so you don't have to I don't think
|
|
mention that but the log out thing assures them that their data will be removed but it's it's
|
|
fair warning as well like hey look don't keep your stuff here without putting it on the cloud
|
|
or on a thumb drive or something because it is going to be erased. They need to know that
|
|
people need to know what they're what they're signing up for when they're signing in to a computer.
|
|
I think it's also sort of our responsibility to admit that glitches and exceptions could occur.
|
|
I mean especially if you're using the system D work around in that case I think it would be
|
|
sort of I think it would be the right thing to say is that you know like while we're doing
|
|
our best to ensure that all data is removed you know it's not entirely impossible for the data to be
|
|
cashed for you know less than 24 hours and in some instances something like that so that
|
|
people know that there's a vague chance that data could be preserved beyond the expectation
|
|
and if they're not comfortable with that and that's that's perfectly all right then they know
|
|
what not to do on your on this system obviously telling people or reminding people that they're
|
|
on a public computer on a public network is probably a good thing as well so without going into all
|
|
of the security measures we would need to do to keep people somewhat protected from malicious
|
|
actors on all public computers I I think in terms of just getting that data erased that's what
|
|
I've come up with a GDM ram disk or system D in a pinch I hope this was useful uh give it a go try
|
|
it out see if it's a useful thing for your laptop a guest account I find it really kind of a nice
|
|
to have it's not necessary because realistically not that many people ask to use computers these days
|
|
again a pinch they have their mobile phones so it doesn't really matter but it's kind of a nice to
|
|
have it's kind of cool so um of course for me I also have to switch the keyboard over to from
|
|
divorce act to courties so that's a thing as well I haven't really looked into how to make that
|
|
automated on my guest account I'm not that concerned about it because again not that many people
|
|
ask but it's still a fun project and certainly it's very useful for a public installation so
|
|
hopefully this is uh informed you or giving you some ideas if you ever have to come up with something
|
|
like that for your library or a museum or or somewhere that you work where you want to provide
|
|
public computing services to people thanks for listening talk to you next time
|
|
You have been listening to the Hacker Public Radio podcast, at hackerpublicradio.org.
|
|
Today's show was contributed by a HPR listener like yourself.
|
|
If you ever thought of recording a podcast, then visit the HPR site to find out how easy it really is.
|
|
Hosting for HPR has been kindly provided by anhonesthost.com, the Internet Archive, rsync.net, and the HPR Community Content Delivery Network.
|
|
Unless otherwise stated, today's show is released under a Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.
|